• EF联合查询的新用法


    用EF很多年了,做联合查询时,只知道linq和lambda两种语法,今天朋友发了一个链接,打开看后发现是EF内置的新的关于联合查询的方法,赶紧抄录下来,以备后用。

    现在先把这几种方法,各写一个例子,便于大家参考:

    linq:

                    var re = from o in db.Order
                             join d in db.OrderDetail
                             on o.Code equals d.OrderCode
                             join p in db.Product
                             on d.ProductID equals p.id
                             where o.Code == "20150326000096"
                             select new {
                                OrderCode = o.Code,
                                ProductName = p.Name,
                                SalePrice = p.SalePrice,
                                ProductQuantity = d.Quantity,
                                Amount = d.Amount
                             };

    SELECT 
        [Extent1].[ProductID] AS [ProductID], 
        [Extent1].[OrderCode] AS [OrderCode], 
        [Extent2].[Name] AS [Name], 
        [Extent2].[SalePrice] AS [SalePrice], 
        [Extent1].[Quantity] AS [Quantity], 
        [Extent1].[Amount] AS [Amount]
        FROM  [dbo].[OrderDetails] AS [Extent1]
        INNER JOIN [dbo].[Products] AS [Extent2] ON [Extent1].[ProductID] = [Extent2].[id]
        WHERE ([Extent1].[OrderCode] IS NOT NULL) AND (N'20150326000096' = [Extent1].[OrderCode])


    lambda:

    re = db.OrderDetail.Where(d => d.OrderCode == "20150326000096").Select(d => new {
                        OrderCode = d.Order.Code,
                        ProductName = d.Product.Name,
                        SalePrice = d.Product.SalePrice,
                        ProductQuantity = d.Quantity,
                        Amount = d.Amount               
                    });

    SELECT 
        [Extent1].[ProductID] AS [ProductID], 
        [Extent1].[OrderCode] AS [OrderCode], 
        [Extent2].[Name] AS [Name], 
        [Extent2].[SalePrice] AS [SalePrice], 
        [Extent1].[Quantity] AS [Quantity], 
        [Extent1].[Amount] AS [Amount]
        FROM  [dbo].[OrderDetails] AS [Extent1]
        INNER JOIN [dbo].[Products] AS [Extent2] ON [Extent1].[ProductID] = [Extent2].[id]
        WHERE N'20150326000096' = [Extent1].[OrderCode]


    内置join方法:

    var re = db.Employees.Join(db.Orders, e => e.EmployeeID, o => o.EmployeeID, (e, o) => new { EmployeeID = e.EmployeeID, OrderID = o.OrderID, Address = o.ShipAddress, EmployeeAddress = e.Address });
    SELECT 
        [Extent1].[EmployeeID] AS [EmployeeID], 
        [Extent2].[OrderID] AS [OrderID], 
        [Extent2].[ShipAddress] AS [ShipAddress], 
        [Extent1].[Address] AS [Address]
    from  [dbo].[Employees] AS [Extent1]
    INNER JOIN [dbo].[Orders] AS [Extent2] ON [Extent1].[EmployeeID]= [Extent2].[EmployeeID]


    内置Join用法2:

    var re = db.Employees.Join(db.Orders, e => e.EmployeeID, o => o.EmployeeID, (e, o) => new { EmployeeID = e.EmployeeID, OrderID = o.OrderID });
    SELECT 
        [Extent1].[EmployeeID] AS [EmployeeID], 
        [Extent1].[OrderID] AS [OrderID]
    FROM [dbo].[Orders] AS [Extent1]
    WHERE [Extent1].[EmployeeID] IS NOT NULL


    内置的GroupJoin方法:

    var re = db.Categories.GroupJoin(db.Products, c => c.CategoryID, p => p.CategoryID, (c, p) => new { CategoryID = c.CategoryID, ProductList = p });
    SELECT 
    [Project1].[CategoryID] AS [CategoryID], 
    [Project1].[C1] AS [C1], 
    [Project1].[ProductID] AS [ProductID], 
    [Project1].[ProductName] AS [ProductName], 
    [Project1].[SupplierID] AS [SupplierID], 
    [Project1].[CategoryID1] AS [CategoryID1], 
    [Project1].[QuantityPerUnit] AS [QuantityPerUnit], 
    [Project1].[UnitPrice] AS [UnitPrice], 
    [Project1].[UnitsInStock] AS [UnitsInStock], 
    [Project1].[UnitsOnOrder] AS [UnitsOnOrder], 
    [Project1].[ReorderLevel] AS [ReorderLevel], 
    [Project1].[Discontinued] AS [Discontinued]
    from ( SELECT 
        [Extent1].[CategoryID] AS [CategoryID], 
        [Extent2].[ProductID] AS [ProductID], 
        [Extent2].[ProductName] AS [ProductName], 
        [Extent2].[SupplierID] AS [SupplierID], 
        [Extent2].[CategoryID] AS [CategoryID1], 
        [Extent2].[QuantityPerUnit] AS [QuantityPerUnit], 
        [Extent2].[UnitPrice] AS [UnitPrice], 
        [Extent2].[UnitsInStock] AS [UnitsInStock], 
        [Extent2].[UnitsOnOrder] AS [UnitsOnOrder], 
        [Extent2].[ReorderLevel] AS [ReorderLevel], 
        [Extent2].[Discontinued] AS [Discontinued], 
        CASE WHEN ([Extent2].[ProductID] IS NULL) THEN CAST(NULL ASint) ELSE 1 END AS [C1]
        FROM  [dbo].[Categories] AS [Extent1]
        LEFT OUTER JOIN [dbo].[Products] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]
    )  AS [Project1]
    ORDER BY [Project1].[CategoryID] ASC, [Project1].[C1] ASC


    Join和GroupJoin方法还没用过,代码是照搬的,以后应用中发现了什么再来修改吧,先贴出来备用

    参考文章:EntityFramework查询--联合查询(Join,GroupJoin)

    
  • 相关阅读:
    IT经典书籍——Head First系列【推荐】
    IT经典书籍——Head First系列【推荐】
    使用JSP实现用户登录
    使用JSP实现用户登录
    【知乎精选】如何面试一个产品经理?如何判断一个产品经理是否是一个很牛的产品经理?
    淘宝API总结
    「用户标签」在数据库设计时应该如何存储?
    【爬虫集合】抖音API分析
    商业架构体系
    短视频带货
  • 原文地址:https://www.cnblogs.com/foren/p/6009082.html
Copyright © 2020-2023  润新知