我想知道是否有人知道为什么linq实体似乎总是产生左外连接。我可以在可选的关系上理解它,但是当关系是强制性的时候它没有意义。为什么Linq to Entities会生成左外连接?
有没有人有任何想法如何使它生成内部连接?
我想知道是否有人知道为什么linq实体似乎总是产生左外连接。我可以在可选的关系上理解它,但是当关系是强制性的时候它没有意义。为什么Linq to Entities会生成左外连接?
有没有人有任何想法如何使它生成内部连接?
您可以创建内部连接。您只需使用join
关键字。例如,下面是针对AdventureWorks数据库的查询:
var query = from od in db.SalesOrderHeader
join c in db.Customer on od.Customer.CustomerID equals c.CustomerID
select new { c.AccountNumber, od.OrderDate };
等效SQL:
Select C.AccountNumber, OD.OrderDate
From Sales.SalesOrderHeader As OD
Join Sales.Customer As C
On C.CustomerID = OD.CustomerID
这里就是LINQ查询生成的SQL:
SELECT
1 AS [C1],
[Extent2].[AccountNumber] AS [AccountNumber],
[Extent1].[SalesOrderID] AS [SalesOrderID],
[Extent1].[RevisionNumber] AS [RevisionNumber],
[Extent1].[OrderDate] AS [OrderDate],
[Extent1].[DueDate] AS [DueDate],
[Extent1].[ShipDate] AS [ShipDate],
[Extent1].[Status] AS [Status],
[Extent1].[OnlineOrderFlag] AS [OnlineOrderFlag],
[Extent1].[SalesOrderNumber] AS [SalesOrderNumber],
[Extent1].[PurchaseOrderNumber] AS [PurchaseOrderNumber],
[Extent1].[AccountNumber] AS [AccountNumber1],
[Extent1].[CreditCardApprovalCode] AS [CreditCardApprovalCode],
[Extent1].[SubTotal] AS [SubTotal],
[Extent1].[TaxAmt] AS [TaxAmt],
[Extent1].[Freight] AS [Freight],
[Extent1].[TotalDue] AS [TotalDue],
[Extent1].[Comment] AS [Comment],
[Extent1].[rowguid] AS [rowguid],
[Extent1].[ModifiedDate] AS [ModifiedDate],
[Extent1].[BillToAddressID] AS [BillToAddressID],
[Extent1].[ContactID] AS [ContactID],
[Extent1].[ShipMethodID] AS [ShipMethodID],
[Extent1].[CreditCardID] AS [CreditCardID],
[Extent1].[CurrencyRateID] AS [CurrencyRateID],
[Extent1].[CustomerID] AS [CustomerID],
[Extent1].[SalesPersonID] AS [SalesPersonID],
[Extent1].[TerritoryID] AS [TerritoryID]
FROM [Sales].[SalesOrderHeader] AS [Extent1]
INNER JOIN [Sales].[Customer] AS [Extent2] ON ([Extent1].[CustomerID] = [Extent2].[CustomerID]) OR (([Extent1].[CustomerID] IS NULL) AND ([Extent2].[CustomerID] IS NULL))
您可以轻松地使EF使用INNER JOIN而不使用'join'和[在L2E中使用连接通常是错误的](http://blogs.teamb.com/craigstuntz/2010/01/13/38525/)。 – 2010-05-14 13:16:20
@Craig Stuntz - 您的文章没有提供一个引人注目的论点,为什么不应该在L2S或L2E中使用语法偏好以外的'join'。是否有显着的性能差异?是否有一系列不能用'join'语法编写的查询?是唯一的原因,可以更详细一点? – Thomas 2010-05-14 15:29:30
我认为我对此非常清楚:使用'join'与不使用它相同,除了两次打字和一半的可读性和可维护性。在可以使用导航的情况下,它没有任何优势。 – 2010-05-14 16:15:02
错误的前提。 L2E *经常*使用INNER JOIN,当你没有做某些事情(可能是非显而易见的原因)需要LEFT。具体的查询示例将有助于解释您所看到的内容。 – 2010-05-14 13:17:35