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. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
随机推荐
- Flex 布局学习笔记
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- java程序监控tomcat中部署的项目的状态以及控制某些项目的启动停止
原文:http://blog.csdn.net/liuyuqin1991/article/details/49280777 步骤如下: ①:首先授权用户使获得这些权限 You can find the ...
- 咏南下拉列表非数据敏感控件--TYNSearch
咏南下拉列表非数据敏感控件--TYNSearch 拥有下拉列表控件可以大大地加速软件系统的开发. 控件适用于DELPHI5及以上版本的安装和使用. 控件的使用方法: procedure Tflog.s ...
- 文件流:"fopen","fclose",“ftell”"fseek","fgets","fprintf" ,“feof”,"fwrite","fread"
char const* filename="D:/hello.txt"; 路径名使用的是“/”或者使用 转义字符“\\”: "fopen", FILE *fp= ...
- 【共享单车】—— React后台管理系统开发手记:城市管理和订单管理
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- UVA10312- Expression Bracketing(Catalan + 递推)
option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">题目链接 题意:给出一个序列,长 ...
- 【Excle】如何隐藏数据透视表中的错误值
如下:数据透视表出现错误 怎么解决呢 步骤 方法① 单击数据透视表任意单元格→数据透视表工具→分析→选项→勾选"对于错误值显示"→确定 方法② 右键→数据透视表选项(同样可以修改)
- 【VBA】获取Excle的安装路径
在VBA中,如何获取Excle的安装路径呢?请看以下代码: Sub 获取Excle的安装路径() MsgBox "Excle的安装路径为:" & Application.P ...
- mysql :安装过程中的问题
安装mysql 选择路径的问题 出现如下问题:说明之前安装过mysql,写在的不干净
- Android API Guides---RenderScript
RenderScript RenderScript是在Android上的高性能执行计算密集型任务的框架. RenderScript主要面向与数据并行计算的使用.尽管串行计算密集型工作负载能够受益.该R ...