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教学网)

更多

推荐ASP.NET教程文章