我有继承的实体框架对象模型。
我的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]
这是最简单的例子。其他查询太大而且难以阅读。
有没有办法忽略吸气并只对一个表创建简单查询。
答案 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的更多信息。