架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9497|回复: 0

[ASP.NET] 详解Linq联合查询表结果集的返回

[复制链接]
发表于 2015-5-8 16:34:23 | 显示全部楼层 |阅读模式

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

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

  1.匿名类型的传递


  
  static void Main(string[] args)   
  {   var User = GetAnonymous().Cast(new { UserName = "", LastLoginIp = "" });           
     Console.Write(User.UserName);      
  }         
  static object GetAnonymous()     
  {     var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
        return User;     
  }
  当我们定义一个匿名类型,只能通过object类型传递,传递后编译器将无法获悉匿名类型的实际类型。

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


  
  public static T Cast(this object o, T t)      
  {            
     return ();         
  }
  2.Linq联合查询之如何生成匿名类型的List?        


  
  var User = GetAnonymous().Cast(new { UserName = "", LastLoginIp = "" });         
  var list = new List< ?>();
  原理和上面一致。


  
  var User = new   
  {     
     UserName = "yaosansi", LastLoginIp = "127.0.0.1"
  };              
  var list = User.MakeList();         
  list.Add(User);            
  Console.Write(list[0].UserName);
  我们再来看看MakeList()方法:


  
  public static List MakeList(this T t)          {            
      return new List();      
  }
  当然,你可能想到上面的方法还不够完美,需要在List中Add一个User,于是有了下面的方法:      


  
  public static List MakeList(this T t,params T[] items)         
  {            
     return new List(items);   
  }  
  这时调用的时候可以写成:


  
  var User = new   
  {   
    UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
  };              
  var list = User.MakeList(User);         
  Console.Write(list[0].UserName);   
  这回我们切入正题,来了解一下Linq联合查询是怎样实现的。


  
  var q =    from p in db.Products     
   where p.Supplier.Country == "USA" && p.UnitsInStock == 0   
  select p;
  以上的查询是两个有关系的表,并且返回的只是一个表的内容,这种情况下可以在数据层中返回强类型的List。如:


  
  public List SelectProducts()   
  {      var q = from p in db.Products     
         where p.Supplier.Country == "USA" && p.UnitsInStock == 0        
         select p;        
         return q.ToList;   
  }
  如果返回的结果集是两个以上表的时候,那该如何传递呢? 聪明的你一定想到了,如果返回的是单行数据的结果集就可以我们前面提到的使用匿名类型的传递得到我们需要的结果. public object


  
  public object SelectProducts()  
  {      var q = from p in db.Products      
         where p.Supplier.Country == "USA" && p.UnitsInStock == 0        
         select new {p.UnitsInStock,p.Supplier.Sid};      var result = q.Single();  
         return result;   
  }
  但这个前提是业务逻辑层需要知道数据层的匿名类型中的具体类型。这样分层的意义也就不大了。这并不是我们想要的。而且返回多行数据的结果集时用 匿名的List类型 的方法经实验也失败了。这就意味着本文开篇的两种传递匿名类型的方法都行不通。

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


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

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

  数据层:


  
  public IEnumerable GetCustomersWithOrders(Func,
  TProjection> projection)   
  {    return from customer in _customers           
       let customerOrders = from  order in _orders                                
       where order.CustomerID = customer.ID            
       select projection(customer, customerOrders);  
  }
  业务逻辑层:


  
  var results = GetCustomersWithOrders(  
  (customer, orders) => new   
  {    Name = customer.Name,               
       OrderCount = orders.Count()        
  });
  这样返回的结果在业务逻辑层里仍然是真正的匿名类型,可以直接使用了。

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




上一篇:LINQ获取存储过程返回值问题我的存储过程
下一篇:微软抛弃IE决心大 22万行代码说不要就不要
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-18 16:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表