再接再厉VS 2008 sp1 + .NET 3.5 sp1(3) - Entity Framework(实体框架)之详解 Linq To Entities 之二

[索引页]
[源码下载]


再接再厉VS 2008 sp1 + .NET 3.5 sp1(3) - Entity Framework(实体框架)之详解 Linq To Entities 之二


作者: webabcd


介绍
以Northwind为示例数据库,ADO.NET Entity Framework之Linq To Entities
  • Select - 选择需要返回的字段
  • Where - 筛选
  • OrderBy - 正序排序
  • OrderByDescending - 倒序排序
  • ThenBy - 在 OrderBy 或 OrderByDescending 的基础上再正序排序
  • ThenByDescending - 在 OrderBy 或 OrderByDescending 的基础上再倒序排序
  • GroupBy - 分组
  • Join - 连接
  • GroupJoin - 连接后分组


示例
Select
using  (var ctx  =   new  NorthwindEntities())
{
    
// Select 对应的 Linq 方法
    var p1 = ctx.Products.Select(p => new { ProductName = "产品名称:" + p.ProductName });
    p1.ToList();

    
// Select 对应的查询语法
    var p2 = from p in ctx.Products select new { ProductName = "产品名称:" + p.ProductName };
    p2.ToList();
}
-- Select 对应的 sql 语句

SELECT  
1   AS   [ C1 ]
N
' 产品名称: '   +   [ Extent1 ] . [ ProductName ]   AS   [ C2 ]
FROM   [ dbo ] . [ Products ]   AS   [ Extent1 ]

Where
using  (var ctx  =   new  NorthwindEntities())
{
    
// Where 对应的 Linq 方法
    var p1 = ctx.Products.Where(p => p.ProductID > 3);
    p1.ToList();

    
// Where 对应的查询语法
    var p2 = from p in ctx.Products where p.ProductID > 3 select p;
    p2.ToList();
}
-- Where 对应的 sql 语句

SELECT  
1   AS   [ C1 ]
[ Extent1 ] . [ Discontinued ]   AS   [ Discontinued ]
[ Extent1 ] . [ ProductID ]   AS   [ ProductID ]
[ Extent1 ] . [ ProductName ]   AS   [ ProductName ]
[ Extent1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
[ Extent1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
[ Extent1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
[ Extent1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
[ Extent1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
[ Extent1 ] . [ CategoryID ]   AS   [ CategoryID ]
[ Extent1 ] . [ SupplierID ]   AS   [ SupplierID ]
FROM   [ dbo ] . [ Products ]   AS   [ Extent1 ]
WHERE   [ Extent1 ] . [ ProductID ]   >   3

OrderBy
using  (var ctx  =   new  NorthwindEntities())
{
    
// OrderBy 对应的 Linq 方法
    var p1 = ctx.Products.OrderBy(p => p.UnitPrice);
    p1.ToList();

    
// OrderBy 对应的查询语法
    var p2 = from p in ctx.Products orderby p.UnitPrice select p;
    p2.ToList();
}
-- OrderBy 对应的 sql 语句

SELECT  
[ Project1 ] . [ C1 ]   AS   [ C1 ]
[ Project1 ] . [ Discontinued ]   AS   [ Discontinued ]
[ Project1 ] . [ ProductID ]   AS   [ ProductID ]
[ Project1 ] . [ ProductName ]   AS   [ ProductName ]
[ Project1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
[ Project1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
[ Project1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
[ Project1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
[ Project1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
[ Project1 ] . [ CategoryID ]   AS   [ CategoryID ]
[ Project1 ] . [ SupplierID ]   AS   [ SupplierID ]
FROM  (  SELECT  
    
[ Extent1 ] . [ CategoryID ]   AS   [ CategoryID ]
    
[ Extent1 ] . [ Discontinued ]   AS   [ Discontinued ]
    
[ Extent1 ] . [ ProductID ]   AS   [ ProductID ]
    
[ Extent1 ] . [ ProductName ]   AS   [ ProductName ]
    
[ Extent1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
    
[ Extent1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
    
[ Extent1 ] . [ SupplierID ]   AS   [ SupplierID ]
    
[ Extent1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
    
[ Extent1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
    
[ Extent1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
    
1   AS   [ C1 ]
    
FROM   [ dbo ] . [ Products ]   AS   [ Extent1 ]
)  
AS   [ Project1 ]
ORDER   BY   [ Project1 ] . [ UnitPrice ]   ASC

OrderByDescending
using  (var ctx  =   new  NorthwindEntities())
{
    
// OrderByDescending 对应的 Linq 方法
    var p1 = ctx.Products.OrderByDescending(p => p.UnitPrice);
    p1.ToList();

    
// OrderByDescending 对应的查询语法
    var p2 = from p in ctx.Products orderby p.UnitPrice descending select p;
    p2.ToList();
}
-- OrderByDescending 对应的 sql 语句

SELECT  
[ Project1 ] . [ C1 ]   AS   [ C1 ]
[ Project1 ] . [ Discontinued ]   AS   [ Discontinued ]
[ Project1 ] . [ ProductID ]   AS   [ ProductID ]
[ Project1 ] . [ ProductName ]   AS   [ ProductName ]
[ Project1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
[ Project1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
[ Project1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
[ Project1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
[ Project1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
[ Project1 ] . [ CategoryID ]   AS   [ CategoryID ]
[ Project1 ] . [ SupplierID ]   AS   [ SupplierID ]
FROM  (  SELECT  
    
[ Extent1 ] . [ CategoryID ]   AS   [ CategoryID ]
    
[ Extent1 ] . [ Discontinued ]   AS   [ Discontinued ]
    
[ Extent1 ] . [ ProductID ]   AS   [ ProductID ]
    
[ Extent1 ] . [ ProductName ]   AS   [ ProductName ]
    
[ Extent1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
    
[ Extent1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
    
[ Extent1 ] . [ SupplierID ]   AS   [ SupplierID ]
    
[ Extent1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
    
[ Extent1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
    
[ Extent1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
    
1   AS   [ C1 ]
    
FROM   [ dbo ] . [ Products ]   AS   [ Extent1 ]
)  
AS   [ Project1 ]
ORDER   BY   [ Project1 ] . [ UnitPrice ]   DESC

ThenBy
using  (var ctx  =   new  NorthwindEntities())
{
    
// ThenBy 对应的 Linq 方法
    var p1 = ctx.Products.OrderBy(p => p.UnitPrice).ThenBy(p => p.ProductID);
    p1.ToList();

    
// ThenBy 对应的查询语法
    var p2 = from p in ctx.Products orderby p.UnitPrice ascending, p.ProductID ascending select p;
    p2.ToList();
}
-- ThenBy 对应的 sql 语句

SELECT  
[ Project1 ] . [ C1 ]   AS   [ C1 ]
[ Project1 ] . [ Discontinued ]   AS   [ Discontinued ]
[ Project1 ] . [ ProductID ]   AS   [ ProductID ]
[ Project1 ] . [ ProductName ]   AS   [ ProductName ]
[ Project1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
[ Project1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
[ Project1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
[ Project1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
[ Project1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
[ Project1 ] . [ CategoryID ]   AS   [ CategoryID ]
[ Project1 ] . [ SupplierID ]   AS   [ SupplierID ]
FROM  (  SELECT  
    
[ Extent1 ] . [ CategoryID ]   AS   [ CategoryID ]
    
[ Extent1 ] . [ Discontinued ]   AS   [ Discontinued ]
    
[ Extent1 ] . [ ProductID ]   AS   [ ProductID ]
    
[ Extent1 ] . [ ProductName ]   AS   [ ProductName ]
    
[ Extent1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
    
[ Extent1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
    
[ Extent1 ] . [ SupplierID ]   AS   [ SupplierID ]
    
[ Extent1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
    
[ Extent1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
    
[ Extent1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
    
1   AS   [ C1 ]
    
FROM   [ dbo ] . [ Products ]   AS   [ Extent1 ]
)  
AS   [ Project1 ]
ORDER   BY   [ Project1 ] . [ UnitPrice ]   ASC [ Project1 ] . [ ProductID ]   ASC

ThenByDescending
using  (var ctx  =   new  NorthwindEntities())
{
    
// ThenByDescending 对应的 Linq 方法
    var p1 = ctx.Products.OrderBy(p => p.UnitPrice).ThenByDescending(p => p.ProductID);
    p1.ToList();

    
// ThenByDescending 对应的查询语法
    var p2 = from p in ctx.Products orderby p.UnitPrice ascending, p.ProductID descending select p;
    p2.ToList();
}
-- ThenByDescending 对应的 sql 语句

SELECT  
[ Project1 ] . [ C1 ]   AS   [ C1 ]
[ Project1 ] . [ Discontinued ]   AS   [ Discontinued ]
[ Project1 ] . [ ProductID ]   AS   [ ProductID ]
[ Project1 ] . [ ProductName ]   AS   [ ProductName ]
[ Project1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
[ Project1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
[ Project1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
[ Project1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
[ Project1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
[ Project1 ] . [ CategoryID ]   AS   [ CategoryID ]
[ Project1 ] . [ SupplierID ]   AS   [ SupplierID ]
FROM  (  SELECT  
    
[ Extent1 ] . [ CategoryID ]   AS   [ CategoryID ]
    
[ Extent1 ] . [ Discontinued ]   AS   [ Discontinued ]
    
[ Extent1 ] . [ ProductID ]   AS   [ ProductID ]
    
[ Extent1 ] . [ ProductName ]   AS   [ ProductName ]
    
[ Extent1 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
    
[ Extent1 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
    
[ Extent1 ] . [ SupplierID ]   AS   [ SupplierID ]
    
[ Extent1 ] . [ UnitPrice ]   AS   [ UnitPrice ]
    
[ Extent1 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
    
[ Extent1 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
    
1   AS   [ C1 ]
    
FROM   [ dbo ] . [ Products ]   AS   [ Extent1 ]
)  
AS   [ Project1 ]
ORDER   BY   [ Project1 ] . [ UnitPrice ]   ASC [ Project1 ] . [ ProductID ]   DESC

GroupBy
using  (var ctx  =   new  NorthwindEntities())
{
    
// GroupBy 对应的 Linq 方法
    var p1 = ctx.Products.GroupBy(p => p.Suppliers.SupplierID).Select(g => new { Group = g.Key, Member = g });
    
foreach (var g in p1)
    
{
        
// g.Group - 供货商ID,以此分组
        
// g.Member - 某供货商下的所有产品
        foreach (var m in g.Member)
        
{
            
// code
        }

    }


    
// GroupBy 对应的查询语法
    var p2 = from p in ctx.Products group p by p.Suppliers.SupplierID into g select new { Group = g.Key, Member = g };
    
foreach (var g in p2)
    
{
        
// g.Group - 供货商ID,以此分组
        
// g.Member - 某供货商下的所有产品
        foreach (var m in g.Member)
        
{
            
// code
        }

    }

}
-- GroupBy 对应的 sql 语句

SELECT  
[ Project2 ] . [ SupplierID ]   AS   [ SupplierID ]
[ Project2 ] . [ C1 ]   AS   [ C1 ]
[ Project2 ] . [ C2 ]   AS   [ C2 ]
[ Project2 ] . [ C4 ]   AS   [ C3 ]
[ Project2 ] . [ C3 ]   AS   [ C4 ]
[ Project2 ] . [ Discontinued ]   AS   [ Discontinued ]
[ Project2 ] . [ ProductID ]   AS   [ ProductID ]
[ Project2 ] . [ ProductName ]   AS   [ ProductName ]
[ Project2 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
[ Project2 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
[ Project2 ] . [ UnitPrice ]   AS   [ UnitPrice ]
[ Project2 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
[ Project2 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
[ Project2 ] . [ CategoryID ]   AS   [ CategoryID ]
[ Project2 ] . [ SupplierID1 ]   AS   [ SupplierID1 ]
FROM  (  SELECT  
    
[ Distinct1 ] . [ SupplierID ]   AS   [ SupplierID ]
    
1   AS   [ C1 ]
    
1   AS   [ C2 ]
    
CASE   WHEN  ( [ Extent2 ] . [ Discontinued ]   IS   NULL THEN   CAST ( NULL   AS   int ELSE   1   END   AS   [ C3 ]
    
[ Extent2 ] . [ CategoryID ]   AS   [ CategoryID ]
    
[ Extent2 ] . [ Discontinued ]   AS   [ Discontinued ]
    
[ Extent2 ] . [ ProductID ]   AS   [ ProductID ]
    
[ Extent2 ] . [ ProductName ]   AS   [ ProductName ]
    
[ Extent2 ] . [ QuantityPerUnit ]   AS   [ QuantityPerUnit ]
    
[ Extent2 ] . [ ReorderLevel ]   AS   [ ReorderLevel ]
    
[ Extent2 ] . [ SupplierID ]   AS   [ SupplierID1 ]
    
[ Extent2 ] . [ UnitPrice ]   AS   [ UnitPrice ]
    
[ Extent2 ] . [ UnitsInStock ]   AS   [ UnitsInStock ]
    
[ Extent2 ] . [ UnitsOnOrder ]   AS   [ UnitsOnOrder ]
    
CASE   WHEN  ( [ Extent2 ] . [ Discontinued ]   IS   NULL THEN   CAST ( NULL   AS   int ELSE   1   END   AS   [ C4 ]
    
FROM    ( SELECT   DISTINCT  
        
[ Extent1 ] . [ SupplierID ]   AS   [ SupplierID ]
        
FROM   [ dbo ] . [ Products ]   AS   [ Extent1 ]  )  AS   [ Distinct1 ]
    
LEFT   OUTER   JOIN   [ dbo ] . [ Products ]   AS   [ Extent2 ]   ON  ( [ Extent2 ] . [ SupplierID ]   =   [ Distinct1 ] . [ SupplierID ] OR  (( [ Extent2 ] . [ SupplierID ]   IS   NULL AND  ( [ Distinct1 ] . [ SupplierID ]   IS   NULL ))
)  
AS   [ Project2 ]
ORDER   BY   [ Project2 ] . [ SupplierID ]   ASC [ Project2 ] . [ C4 ]   ASC

Join
using  (var ctx  =   new  NorthwindEntities())
{
    
// Join 对应的 Linq 方法
    var p1 = ctx.Products.Join(
        ctx.Categories,
        p 
=> p.Categories.CategoryID,
        c 
=> c.CategoryID,
        (p, c) 
=> new { c.CategoryName, p.ProductName });
    p1.ToList();

    
// Join 对应的查询语法
    var p2 = from p in ctx.Products
             join c 
in ctx.Categories
             on p.Categories.CategoryID equals c.CategoryID
             select 
new { c.CategoryName, p.ProductName };
    p2.ToList();
}
-- Join 对应的 sql 语句

SELECT  
1   AS   [ C1 ]
[ Extent2 ] . [ CategoryName ]   AS   [ CategoryName ]
[ Extent1 ] . [ ProductName ]   AS   [ ProductName ]
FROM    [ dbo ] . [ Products ]   AS   [ Extent1 ]
INNER   JOIN   [ dbo ] . [ Categories ]   AS   [ Extent2 ]   ON  ( [ Extent1 ] . [ CategoryID ]   =   [ Extent2 ] . [ CategoryID ] OR  (( [ Extent1 ] . [ CategoryID ]   IS   NULL AND  ( [ Extent2 ] . [ CategoryID ]   IS   NULL ))

GroupJoin
using  (var ctx  =   new  NorthwindEntities())
{
    
// GroupJoin 对应的 Linq 方法
    var p1 = ctx.Categories.GroupJoin(
        ctx.Products,
        c 
=> c.CategoryID,
        p 
=> p.Categories.CategoryID,
        (p, g) 
=> new { p.CategoryName, ProductCount = g.Count() });
    p1.ToList();

    
// GroupJoin 对应的查询语法
    var p2 = from c in ctx.Categories
             join p 
in ctx.Products
             on c.CategoryID equals p.Categories.CategoryID into g 
// g - IEnumerable<Products>
             select new { CategoryName = c.CategoryName, ProductCount = g.Count() };
    p2.ToList();
}
-- GroupJoin 对应的 sql 语句

SELECT  
1   AS   [ C1 ]
[ Project1 ] . [ CategoryName ]   AS   [ CategoryName ]
[ Project1 ] . [ C1 ]   AS   [ C2 ]
FROM  (  SELECT  
    
[ Extent1 ] . [ CategoryName ]   AS   [ CategoryName ]
    (
SELECT  
        
COUNT ( cast ( 1   as   bit ))  AS   [ A1 ]
        
FROM   [ dbo ] . [ Products ]   AS   [ Extent2 ]
        
WHERE  ( [ Extent1 ] . [ CategoryID ]   =   [ Extent2 ] . [ CategoryID ] OR  (( [ Extent1 ] . [ CategoryID ]   IS   NULL AND  ( [ Extent2 ] . [ CategoryID ]   IS   NULL )))  AS   [ C1 ]
    
FROM   [ dbo ] . [ Categories ]   AS   [ Extent1 ]
)  
AS   [ Project1 ]


OK
[源码下载]

你可能感兴趣的:(framework)