再接再厉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    
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    
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  NULLTHEN 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  NULLTHEN 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  NULLAND ([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    
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  NULLAND ([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    
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  NULLAND ([Extent2].[CategoryID]  IS  NULL)))  AS [C1] 
        FROM [dbo].[Categories]  AS [Extent1] 
)     AS [Project1]
 
 



     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341461,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值