【问题标题】:Why does EF generate this sql when querying reference property为什么EF在查询引用属性时会生成这个sql
【发布时间】:2011-06-17 06:56:06
【问题描述】:

使用 AdventureWorks 数据库并发出此查询时:

   AdventureWorksEntities entities = new AdventureWorksEntities();
   entities.Contacts.Where(x => x.FirstName == "A" 
                               || x.FirstName == "B" 
                               || x.FirstName == "C")
                     .ToList();

会被翻译成这个sql,这是能做到的最好的:

//ommited for brevity
FROM [Person].[Contact] AS [Extent1]
WHERE [Extent1].[FirstName] IN (N'A',N'B',N'C')

但是当我发出这个查询时:

entities.Employee.Where(x => x.Contact.FirstName == "A" 
                             || x.Contact.FirstName == "B" 
                             || x.Contact.FirstName == "C")
                .ToList();

我得到了这个 SQL:

//ommited for brevity
FROM   [HumanResources].[Employee] AS [Extent1]
INNER JOIN [Person].[Contact] AS [Extent2] ON [Extent1].[ContactID] = [Extent2].[ContactID]
LEFT OUTER JOIN [Person].[Contact] AS [Extent3] ON [Extent1].[ContactID] = [Extent3].[ContactID]
WHERE [Extent2].[FirstName] = N'A' OR [Extent3].[FirstName] IN (N'B',N'C')

为什么我得到一个内连接和外连接,而 EF 将它们的位置分开?

注意使用 contains 创建相同的 SQL:

var names = new List<string>{"A", "B", "C"};
entities.Employee.Where(x => names.Contains(x.Contact.FirstName)).ToList();

编辑:所以它似乎是一个 EF 错误,我已经接受了提供解决方法的答案

编辑:打开连接问题,它位于here

【问题讨论】:

    标签: sql entity-framework entity-framework-4


    【解决方案1】:

    看起来像 EF 中的一个错误。

    我认为问题与您检查子表中的字段有关。 EF 没有看到所有 OR 子句都引用同一张表和该表中的同一字段。因此,它创建了复杂的连接。

    尝试重写它以使用 CONTAINS 而不是 OR。

    Using contains() in LINQ to SQL

    【讨论】:

    • Contains 具有相同的行为。
    【解决方案2】:

    编写一个接受 TVP 作为输入参数的存储过程,并让 EF 实现来自 SP 的结果 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多