详解Linq联合查询表结果集的返回

本文笔者详细的介绍了Linq联合查询,因为怕读者对这方面只是不是很理解,所以在讲Linq联合查询之前先为大家做了一些知识的铺垫,然后再具体讲Linq联合查询是怎样实现的,希望能给大家带来帮助。

创新互联主要从事成都做网站、网站建设、外贸营销网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务芮城,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

首先,我们先来了解一些Linq联合查询的知识点。

1.匿名类型的传递

 
 
 
  1. static void Main(string[] args)   
  2. {   var User = GetAnonymous().Cast(new { UserName = "", LastLoginIp = "" });           
  3.    Console.Write(User.UserName);       
  4. }         
  5. static object GetAnonymous()     
  6. {     var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
  7.       return User;     

当我们定义一个匿名类型,只能通过object类型传递,传递后编译器将无法获悉匿名类型的实际类型。

这行可以通过Cast扩展方法来进行强制转换。以下是Cast方法的原型。

 
 
 
  1. public static T Cast ( this object o, T t)       
  2. {            
  3.    return ();         

2.Linq联合查询之如何生成匿名类型的List?        

 
 
 
  1. var User = GetAnonymous().Cast(new { UserName = "", LastLoginIp = "" });         
  2. var list = new List (); 

原理和上面一致。

 
 
 
  1. var User = new   
  2. {     
  3.    UserName = "yaosansi", LastLoginIp = "127.0.0.1" 
  4. };              
  5. var list = User.MakeList();          
  6. list.Add(User);            
  7. Console.Write(list[0].UserName); 

我们再来看看MakeList()方法:

 
 
 
  1. public static List  MakeList ( this T t)          {             
  2.     return new List ();      

当然,你可能想到上面的方法还不够***,需要在List中Add一个User,于是有了下面的方法:       

 
 
 
  1. public static List  MakeList ( this T t,params T[] items)         
  2. {            
  3.    return new List (items);    
  4. }  

这时调用的时候可以写成:

 
 
 
  1. var User = new   
  2. {   
  3.   UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
  4. };              
  5. var list = User.MakeList(User);          
  6. Console.Write(list[0].UserName);   

这回我们切入正题,来了解一下Linq联合查询是怎样实现的。

 
 
 
  1. var q =    from p in db.Products     
  2.  where p.Supplier.Country == "USA" && p.UnitsInStock == 0    
  3. select p; 

以上的查询是两个有关系的表,并且返回的只是一个表的内容,这种情况下可以在数据层中返回强类型的List。如: 

 
 
 
  1. public List  SelectProducts()   
  2. {      var q = from p in db.Products     
  3.        where p.Supplier.Country == "USA" && p.UnitsInStock == 0        
  4.        select p;        
  5.        return q.ToList ;   

 如果返回的结果集是两个以上表的时候,那该如何传递呢? 聪明的你一定想到了,如果返回的是单行数据的结果集就可以我们前面提到的使用匿名类型的传递得到我们需要的结果. public object

 
 
 
  1. public object SelectProducts()  
  2. {      var q = from p in db.Products      
  3.        where p.Supplier.Country == "USA" && p.UnitsInStock == 0        
  4.        select new {p.UnitsInStock,p.Supplier.Sid};      var result = q.Single();  
  5.        return result;   
  6. }

但这个前提是业务逻辑层需要知道数据层的匿名类型中的具体类型。这样分层的意义也就不大了。这并不是我们想要的。而且返回多行数据的结果集时用 匿名的List类型 的方法经实验也失败了。这就意味着本文开篇的两种传递匿名类型的方法都行不通。

方法一:Linq联合查询自定义与返回类型相同结构的类

 
 
 
  1. public class CustomQuery       
  2. {  public uint UnitsInStock   
  3.    { get; set; }             
  4.   public int Sid   
  5.    { get; set; }        

这样在查询结果为多个表的结果集时,就可以解决了。由于需要知道返回的匿名类型,除了不符合多层以外,还需要额外定义一个类。但这样确时可以使用强类型返回我们所需要的结果。

方法二:Linq联合查询使用System.Func委托 (参考:Returning var from a method in C# 3.0)

数据层:

 
 
 
  1. public IEnumerable  GetCustomersWithOrders (Func , 
  2. TProjection> projection)   
  3. {    return from customer in _customers           
  4.      let customerOrders = from  order in _orders                                
  5.      where order.CustomerID = customer.ID             
  6.      select projection(customer, customerOrders);  

业务逻辑层:

 
 
 
  1. var results = GetCustomersWithOrders(  
  2. (customer, orders) => new   
  3. {   Name = customer.Name,               
  4.   OrderCount = orders.Count()        
  5. }); 

这样返回的结果在业务逻辑层里仍然是真正的匿名类型,可以直接使用了。

方法三:Linq联合查询之使用存储过程或视图

【编辑推荐】

  1. LINQ动态查询的实现浅析
  2. LINQ TO SQL动态修改表名称的实现浅析
  3. LINQ To SQL的一点讨论
  4. 浅析LINQ事务处理的实现
  5. 浅析DataSet和DataTable

文章名称:详解Linq联合查询表结果集的返回
URL标题:http://www.shufengxianlan.com/qtweb/news39/405339.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联