1. 查询
Linq:
var result = from u in UserInfo
where u.ID>2
select u;
Lambda:
var result = UserInfo.where<UserInfo>(u=>u.ID>2);
2. 查询部分列,用到匿名类
Linq:
var result = from u in UserInfo
where u.ID>2
select new {u.ID,u.Name};
Lambda:
var result = UserInfo.where<UserInfo>(u=>u.ID>2).
select(u=>new {u.ID,u.Name});
3. 排序
Linq:
var result = from u in UserInfo
where u.ID>2
order by u.ID;
Lambda:
var result = UserInfo.where<UserInfo>(u=>u.ID>2).
// OrderBy<UserInfo,int>(u=>u.ID).
OrderByDecending<UserInfo,int>(u=>u.ID);
4. 分页
Linq:
var result = (from u in UserInfo orderby u.ID select u).
Skip(5).
Take(5);
Lambda:
var result = UserInfo.where<UserInfo>(u=>u.ID>2).
OrderBy<UserInfo,int>(u=>u.ID).
Skip<UserInfo>(5).
Take<UserInfo>(5);
5.左外连接:可以的连接有Join 和 GroupJoin 方法。GroupJoin组联接等效于左外部联接,它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素)。
var result = from d in edm.Order_Details
join order in edm.Orders
on d.OrderID equals order.OrderID
select new
{
OrderId = order.OrderID,
ProductId = d.ProductID,
UnitPrice = d.UnitPrice
};
-------------------------
var 最终类型都是IQueryable<UserInfo>类型,是离线型集合,每次用到这个集合才到数据库中查,当然用到多次也就要查询多次。
例如下面两个foreach循环,用到result集合才会去查询数据库,并且两次foreach,就去数据库查询两次,这就是延迟加载机制:
foreach(var userinfo in result)
{
}
foreach(var userinfo in result)
{
}
--怎么避免延迟加载机制多次查询数据库的问题??
答:使用内存型的集合。List、Array、IEnumable
var result = UserInfo.where<UserInfo>(u=>u.ID>2).
OrderBy<UserInfo,int>(u=>u.ID).
Skip<UserInfo>(5).
Take<UserInfo>(5).
ToList(); //在使用到此集合时,只需要查询数据库一次,就将数据放到本地内存集合中,以后再用到,就到本地内存中取。
----------------
IQueryable接口与IEnumberable区别:
从例子中分析:
var temp = demoEntities.Product
.Where<Product>(p => p.ProductId > 0)
.OrderBy(p => p.ProductId)
.Skip<Product>(3 * 2)
.Take<Product>(3)
.Select(p => new { p.ProductId,p.ProductName });
IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,
而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令。也是延迟到我要真正显示数据的时候才执行。
---------------------------
namespace System.Linq
{
public interface IQueryable : IEnumerable
{
Expression Expression {get;}
Type ElementType {get;}
IQueryProvider Provider {get;}
}
}
IQueryable继承IEnumerable接口,故可实现foreach遍历。当程序中要使用IQueryable集合中的数据时,IQueryProvider会将Expression翻译成为sql命令树结构,根据一定的算法查询数据库数据,最后将查询到的数据放在此集合中。