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. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
随机推荐
- Python学习笔记——基本数据结构
列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...
- Http标准协议Android网络框架——NoHttp
NoHttp详细文档:http://doc.nohttp.net NoHttp公益测试接口:http://api.nohttp.net 支持与RxJava完美结合.支持一句话切换底层为OkHttp,支 ...
- Unitity 常用工具类
ylbtech-Unitity_C#: Unitity 常用代码 1.A,效果图返回顶部 1.B,源代码返回顶部 1,日期字符串 using System; using System.Xml; / ...
- Window mode
D3D window mode:Upper left (0,0)是左上角 OGL window mode:Lower left(0,0)是左下角 nvn API nvn::Device::SetWin ...
- Oracle Study之-AIX6.1构建Oracle 10gR2 RAC(4)
Oracle Study之-AIX6.1构建Oracle 10gR2 RAC(4) 一.安装CRS补丁 在安装CRS之前,须要安装补丁p6718715_10203_AIX64-5L,否则在安装时会出现 ...
- sql 查询重复的数据
select * from yryz_role_partner where user_id in (select user_id from yryz_role_partner group by use ...
- InternalNative.cpp
1 /* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Ver ...
- RxJava操作符总结之过滤
RxJava操作符总结之过滤 jsut() just(T t1, T t2, T t3 ....) ,just能够传入多个同样类型的參数,并将当前參数一个接着一个的发送. Observable.jus ...
- perftools查看堆外内存并解决hbase内存溢出
最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g.感觉非常诡异.堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪: http://cod ...
- 怎样在QML应用中调用系统设置中的页面来设置我们的系统
我们在QML应用中有时须要调用系统设置(system settings)来完毕我们的一些设置.比方,我们在使用GPS来定位时,可能GPS并没有打开,假设在我们的应用中直接打开系统中的GPS设置页面,这 ...