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

例如某个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. PowerPoint在线浏览的几个方案

    思路:将ppt转换成pdf.image后实现在线浏览功能 下面的解决方案均不用在服务器端安装office 一.找到一个收费的restful接口,测试可用 http://www.convertapi.c ...

  2. [置顶] zabbix通过lykchat发送告警信息配置过程

    本文介绍zabbix通过lykchat发送告警信息配置过程. lykchat代码在https://github.com/lykops/lykchat/ 步骤 编写脚本 1).查看服务器端的配置文件et ...

  3. C和C++中函数运行时间测试

    //clock()函数为c中,捕捉从程序开始运行到clock运行的时间//时间单位为clock tick,即为时钟打点#include<iostream>#include<cmath ...

  4. appium python api(转)

    Appium_Python_Api文档 1.contextscontexts(self): Returns the contexts within the current session. 返回当前会 ...

  5. Jakarta雅加达项目简介

    Jakarta项目是在Apache软件基金会营运的公开源代码软件开发项目之一.开发着面向编程语言Java的程序库,框架等. Jakarta是Apache组织下的一套Java解决方案的开源软件的名称,它 ...

  6. 怎样允许其他电脑连接本机MySQL

    2017-04-20 1.***\bin\>MySQL -h localhost -u root -p  这样应该可以进入MySQL服务器  执行代码如下: MySQL>use mysql ...

  7. bind域名dns解析及主从服务的配置

    bind域名dns解析及主从服务的配置 1.dns解析介绍     人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应 ...

  8. 2017.9.5 postgresql加密函数的使用

    需要安装的插件的名字:pgcrypto 官网地址:https://www.postgresql.org/docs/9.4/static/pgcrypto.html stackoverflow: htt ...

  9. ant安装配置

    点击进入ant官网,找到下载选项. 选择下载安装文件.其余的源文件和手册的下载步骤完全相同. 可以下载官网上对应系统的最新版本.也可以在old ant 版本中选择自己需要的版本.笔者需要ant-1.9 ...

  10. MySQL 事件EVENT

    一.用途用于某一时间执行一个事件或周期性执行一个事件. 二.语法CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] eve ...