实体框架生成不期望的查询

时间:2018-02-17 18:36:36

标签: c# entity-framework linq

我有继承的实体框架对象模型。

我的linq查询:

Books.ItemsNoTracking.Where(o => o.Id == new Guid("2D46B66E-64CB-4C99-AF94-5C7414048ECF")).First();

预期查询:

SELECT * FROM  [dbo].[Books] AS [Extent1] 
WHERE cast('2d46b66e-64cb-4c99-af94-5c7414048ecf' as uniqueidentifier) = [Extent1].[Id]

但EF产生:

SELECT 
    [Limit1].[C1] AS [C1], 
    [Limit1].[Id] AS [Id], 
    [Limit1].[Created] AS [Created], 
    [Limit1].[OwnerId] AS [OwnerId], 
    [Limit1].[Deleted] AS [Deleted], 
    [Limit1].[PhysicalUnitId] AS [PhysicalObjectId]
    FROM ( SELECT TOP (1) 
        [Extent1].[Id] AS [Id], 
        [Extent1].[PhysicalObjectId] AS [PhysicalObjectId], 
        [Extent2].[Created] AS [Created], 
        [Extent2].[OwnerId] AS [OwnerId], 
        [Extent2].[Deleted] AS [Deleted], 
        '0X0X' AS [C1]
        FROM  [dbo].[Books] AS [Extent1]
        INNER JOIN [dbo].[Objects] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
        WHERE cast('2d46b66e-64cb-4c99-af94-5c7414048ecf' as uniqueidentifier) = [Extent1].[Id]
    )  AS [Limit1]

这是最简单的例子。其他查询太大而且难以阅读。

有没有办法忽略吸气并只对一个表创建简单查询。

1 个答案:

答案 0 :(得分:1)

为了获得您期望的查询,您不应使用First()扩展方法。这就是为您的示例中的内部查询添加Top 1子句的原因。

我不确定您正在运行哪个版本的Entity Framework但是当我在使用Visual Studio附带的EF 6的数据库上运行类似的代码时,它生成了一个简单的一层

SELECT TOP 1 <columns> FROM <table> WHERE ID = <passed in parameter>

由于您正在搜索ID字段,因此可以安全地假设您希望获得单个结果,在这种情况下,您可以使用Single()First()或{ {1}}确保您只有一条记录。

如果您愿意,可以阅读有关这些here的更多信息。