LINQ学习笔记:选取Select(5)
http://www.itjxue.com 2015-07-17 01:59 来源:未知 点击次数:
LINQ to SQL当中的SelectMany
LINQ to SQL当中的SelectMany可以被用于执行交叉连接,非等连接,inner join以及left outer join.我们可以像使用Select一样使用SelectMany,不同的地方在于SelectMany返回的是一个扁平的数据结构而不是层级机构.
交叉连接就像我们上面例举的类似,以下的查询显示了每一个客户对应的每一个采购:
1: var query =
2:
3: from c in dataContext.Customers
4:
5: from p in dataContext.Purchases
6:
7: select c.Name + ” might have bought “ + p.Description;
更通常的情况是我们只想列出客户及其对应的采购单,为此,我们可以增加一个where语句和一个连接断言,结果将会得到一个类似SQL语法的查询:
1: var query =
2:
3: from c in dataContext.Customers
4:
5: from p in dataContext.Purchases
6:
7: where c.ID == p.CustomerID
8:
9: select c.Name + ” bought a “ + p.Description;
如果在你的LINQ to SQL实体类中存在关联属性,你可以使用它们来避免交叉连接:
1: from c in dataContext.Customers
2:
3: from p in c.Purchases
4:
5: select new { c.Name, p.Description };
这样写的好处是我们消除了关联断言,但结果是一致的.
我们还可以增加一个Where语句来做进一步的过滤,例如,我们只想列出那些名字以J开头的客户:
1: from c in dataContext.Customers
2:
3: where c.Name.StartsWith (“J”)
4:
5: from p in c.Purchases
6:
7: select new { c.Name, p.Description };
你也可以将where语句往下移一行,对于这个LINQ to SQL查询,结果是一致的.然后,如果是本地查询的话,这会得到一个相对差一些的性能.对于本地查询,我们总是应该使用before joining.
我们还可以通过增加from语句引出新的表,例如,每一个采购单都有采购明细:
1: from c in dataContext.Customers
2:
3: from p in c.Purchases
4:
5: from pi in p.PurchaseItems
6:
7: select new { c.Name, p.Description, pi.DetailLine };
另外,如果通过关联属性从父表开始选择数据的话我们不需要添加from语句.
1: from c in dataContext.Customers
2:
3: select new {
4:
5: Name = c.Name,
6:
7: SalesPerson = c.SalesPerson.Name
8:
9: };
在这个例子中,我们并没有使用SelectMany因为没有子集合需要处理.关联属性返回了一个单一的项.
(责任编辑:IT教学网)
上一篇:LINQ学习笔记:聚合方法
下一篇:LINQ学习笔记:创建方法