对于关系型数据与对象数据之间最大的隔阂就是由标识列连接起来的行(关系型数据)与由集合保存的对象(对象数据)之间的冲突。

例如某个Subject对象(也就是数据库中的Subject表),从Subject对象可以找到属于它的Book集合,甚至可以在Book对象继续找到其包含的Author集合或者其他暴露出的属性,幸运的是LINQ TO SQL提供了足够的支持.

从Subject类的定义中可以看到,它可包含一个名为Books的属性,用来让程序直接访问到该主题下的图书图像。底下代码将Book对象集合以 System.Data.Linq.EntitySet<Book>泛型类型的形式暴露为Subject类的Books属性的方法。

using System.Data.Linq.Mapping;

{

[Table]

Public class Subject

{

[Column(IsPrimaryKey=true, Name="ID")]

public Guid SubjectID{get;set;}

[Column]

public String Description{get;set;}

[Column]

public String Name{get;set;}

[Association(OtherKey="SubjectId")]

public EntitySet<Book>books{get;set;}

}

}

与对待表和列一样,代码中需要使用Association属性明确告知框架这些对象之间的关系。添加关联的前提条件就是了解Book类型和Subject类型之间是怎样建立联系的.Book类包含一个SubjectId属性,已经被映射到了数据库中Book表的Subject列上。这样,对于Subject类的Books属性,我们就应该指定其相关记录的Key为Book类中SubjectId(由OtherKey指定,或相关对象中作为Key的属性)

遍历对象的层次结构

foreach(Subject subject in dataContext.GetTable<Subject>())

{

Console.writeline(subject.Name)

foreach(Book book in subject.Books)

{

Console.writeline("...{0}",book,Title);

}

}

运行该查询时,可以看到其默认的结果与外连接的结果相同,从对象的角度来看,在获取主题集合时,我们并不知道该主题下是否有与其相关的图书。只有在开始遍历其Books属性时才能得到其包含的图书信息,这样就有可能在显示了主题之后,并没有任何的图书包含在其中。同样,若某本图书没有归为任何的主题,那么也不能显示在结果列表中。

若想继续过滤上述结果,我们需要介绍两个新的扩展方法:Any和All.只有两个结果集合中都存着相关的记录,Any方法才会将其返回。这样,若想返回包含有图书的主题集合,即可使用Any扩展方法。

var query=from subject in Subjects where subject.Books.Any() select subject;

如果需要的话,也可以在where字句中通过简单的取反操作得到不包含任何图书的主题集合

var query=from subject in Subjects where !subject.Books.Any() select subject;

LINQ TO SQL:操作有层次关系的对象的更多相关文章

  1. 关于LINQ和SQL操作数据库的性能测试(转)

    微软linq技术已经出现很久,很多公司已经开始商业使用,作为我们暂时没有用到的人来说,也应该适当的了解下相关知识,但是直到目前网络上对他的看法仍然是褒贬不一,当然任何事情都不可能完美的,下面就针对大多 ...

  2. Linq to sql 操作

    1.往数据库添加数据 NorthwindDataContext abc = new NorthwindDataContext(); abc.Log = Console.Out; User a = ne ...

  3. LINQ to SQL更新数据库操作(转载)

    使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...

  4. linq世界走一走(LINQ TO SQL)

    前言:作为linq的一个组件,同时作为ADO.NET的一个组成部分,LINQ TO SQL提供了将关系数据映射为对象的运行时基础结构. LINQ TO SQL是通过将关系数据库对象的数据模型(如一个数 ...

  5. Linq之Linq to Sql

    目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...

  6. LinQ to SQL 查询

    LINQ to SQL 是将对象关系映射到.NET框架中的一种实现.它可以将关系数据库映射为.NET Framework中的一些类. 然后,开发人员就可以通过使用 LINQ to SQL对数据库中的数 ...

  7. [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  8. 步步学LINQ to SQL:为实体类添加关系【转】

    [IT168 专稿]本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL.附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集. 第一 ...

  9. LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新

    原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S.    以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...

随机推荐

  1. remeber me即记住我功能

    1.登录过程中的记住我功能如图: 2.这样在登录认证的时候,客户端会传递两个cookie:remember_token和Tsession 3.即使客户端不传递cookie中的Tsession,只传递r ...

  2. [转载] K3漏油器全紫铜替换原硅胶垫教程。标准姿势

    首先感谢坛友的支持,全铜套件已经完成了.有的坛友希望有个教程.在这里大体说一下技巧吧.下面步入正题. 声明:本教程图片大部分均来源于给坛友改装时所拍.如有雷同,概不负责!!!声明:本教程图片大部分均来 ...

  3. Vue表单和组件

    一.表单 v-model 指令在表单控件元素上创建双向数据绑定,v-model 会根据控件类型自动选取正确的方法来更新元素. <input v-model="message" ...

  4. 基于ruby环境搭建Redmine

    环境说明 系统版本    CentOS 6.9 x86_64 软件版本    ruby 2.4.4 rails 4.2 redmine-3.4.5 Redmine是一个开源的.基于Web的项目管理和缺 ...

  5. 一个对比各种开源库的网站 libhunt

    https://www.libhunt.com/ https://github.com/LibHunt/awesome-javascript

  6. Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.

    1.Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'. 原因解析: gradle ...

  7. 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)

    并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...

  8. 使用浏览器地址栏调用CXF Webservice的写法

    /* * 通过url调用 * http://localhost:8080/EFP/webService/TestWebservice/testOut/arg0/liuyx */ http://loca ...

  9. eclipse上的git命令使用浅析,搭建Maven项目

    eclipse上的git命令使用浅析 2016-03-31 14:44   关于eclipse上git的安装和建立代码仓库的文章比较多,但作为一个初识git的人更希望了解每个命令的作用. 当项目连接到 ...

  10. Squid 启动/停止/重载配置文件 命令

    当你的 squid.conf 配置文档按照你的想法修改完以后,启动 squid 之旅就开始了. Squid安装设试命令: 1,初始化你在 squid.conf 里配置的 cache 目录 #/usr/ ...