选择单个实体的一部分而不检索整个实体

时间:2012-04-21 14:24:24

标签: entity-framework linq-to-entities

我想从单个实体(通过Id)获得单个属性(blob)。我有:

context.References
    .Single(r => r.ID == id)
    .Blob;

这让我觉得效率低下,因为我得到的是整个Reference,只是为了丢弃除Blob之外的所有内容。这导致了

context.References
    .Where(r => r.ID == id)
    .Select(r => r.Blob)
    .Single();

哪个应该只查询Blob,但最后将Single作为事后补充有点烦人(但强制我认为必要的单一性)。我的问题是:有没有更好的方法来实现这一目标,还是我的第二个代码块就是这样?

谢谢!

2 个答案:

答案 0 :(得分:1)

我担心的是它的样子。在LINQPad中运行查询表明Entity Framework将查询转换为:

SELECT TOP (2) 
[Extent1].[Id] AS [Id], 
[Extent1].[Blob] AS [Blob], 
... etc for all columns
FROM [dbo].[References] AS [Extent1]
WHERE 1 = [Extent1].[Id]

SELECT TOP (2) 
[Extent1].[Blob] AS [Blob]
FROM [dbo].[References] AS [Extent1]
WHERE 1 = [Extent1].[Id]

所以你说第二个查询稍微更有效率是正确的。这是否重要是你需要测试和决定的。

答案 1 :(得分:1)

您可以使用context.References.Single(r => r.ID == id).Blob来组合Where和Single,但这将转移整个实体。为了提高效率,您的解决方案是最好的。