LINQ TO SQL:操作有层次关系的对象
对于关系型数据与对象数据之间最大的隔阂就是由标识列连接起来的行(关系型数据)与由集合保存的对象(对象数据)之间的冲突。
例如某个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:操作有层次关系的对象的更多相关文章
- 关于LINQ和SQL操作数据库的性能测试(转)
微软linq技术已经出现很久,很多公司已经开始商业使用,作为我们暂时没有用到的人来说,也应该适当的了解下相关知识,但是直到目前网络上对他的看法仍然是褒贬不一,当然任何事情都不可能完美的,下面就针对大多 ...
- Linq to sql 操作
1.往数据库添加数据 NorthwindDataContext abc = new NorthwindDataContext(); abc.Log = Console.Out; User a = ne ...
- LINQ to SQL更新数据库操作(转载)
使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...
- linq世界走一走(LINQ TO SQL)
前言:作为linq的一个组件,同时作为ADO.NET的一个组成部分,LINQ TO SQL提供了将关系数据映射为对象的运行时基础结构. LINQ TO SQL是通过将关系数据库对象的数据模型(如一个数 ...
- Linq之Linq to Sql
目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...
- LinQ to SQL 查询
LINQ to SQL 是将对象关系映射到.NET框架中的一种实现.它可以将关系数据库映射为.NET Framework中的一些类. 然后,开发人员就可以通过使用 LINQ to SQL对数据库中的数 ...
- [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- 步步学LINQ to SQL:为实体类添加关系【转】
[IT168 专稿]本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL.附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集. 第一 ...
- LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
随机推荐
- mysql-essential-5.1.55-win32 安装
1.选择无事物安装 2.my.cnf [mysqld] default-storage-engine=INNODB innodb=on 3.设置数据目录 手动创建目录 D:\data [mysqld] ...
- SqlServer发布订阅错误收集
原文:SqlServer发布订阅错误收集 目录 1. SqlServer发布订阅错误收集 1.1. Message:脚本对于表"dbo.table"失败. 1.1.1. 错误消息 ...
- Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor
原文:Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor 一.工具概要 数据库应用系统性能低下,需要对其进行优化 ...
- docker ubunt镜像中文乱码,文件名问号解决
一 安装语言包 中文语言包: language-pack-zh-hans 简体中文 language-pack-zh-hans-base language-pack-zh-hant 繁体中文 lang ...
- 机器学习第3课:线性代数回顾(Linear Algebra Review)
3.1 矩阵和向量 如图:这个是 4×2 矩阵,即 4 行 2 列,如 m 为行,n 为列,那么 m×n 即 4×2 矩阵的维数即行数×列数 矩阵元素(矩阵项): Aij 指第 i 行,第 j 列的 ...
- 面试——谈谈对JAVA的理解
谈谈你对Java平台的理解.答:Java首先是一种面向对象的语言,语言特性有封装,继承,多态,泛型,Lamda表达式等; 第二个特性:支持跨平台,一次书写导出运行(write once,run any ...
- python解析json文件报错No JSON object could be decoded
2017-04-25 可用Nodepad++将json文件打开并以UTF8无BOM格式保存.
- fabricjs 自定义类型
https://stackoverflow.com/questions/36660108/how-to-create-custom-fabricjs-object I have to create a ...
- ECSHOP商品描述和文章里不加水印,只在商品图片和商品相册加水印
fckeditor\editor\filemanager\connectors\php //判断并给符合条件图片加上水印 if ($**tension == 'jpg' || $**tension = ...
- Linux下的各文件夹的作用(转)
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...