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命令树结构,根据一定的算法查询数据库数据,最后将查询到的数据放在此集合中。                 

posted on 2013-01-15 11:47  chay  阅读(374)  评论(0编辑  收藏  举报