zoukankan      html  css  js  c++  java
  • 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)

    
  • 相关阅读:
    javaEE web 系统安装时自定义初始化
    windows 安装绿色版mysql
    myeclipse 安装svn(subeclipsesite)插件
    Xcode连接 Git
    生成16位不重复编码
    百度工程师也犯低级错误(有心还是无意)?
    IBatis 映射文件 sql 中大于、小于等符号转义
    web项目文档总览
    银行卡号的校验
    身份证的校验
  • 原文地址:https://www.cnblogs.com/foren/p/6009082.html
Copyright © 2011-2022 走看看