LINQ to SQL之谜:为什么查询在某些情况下包括所有字段而不包括其他字段?

时间:2010-10-15 21:43:59

标签: vb.net linq-to-sql

此LINQ to SQL查询

From g In Db.Context.Current.Groups
Select g.GroupID

生成此SQL:

SELECT [t0].[GroupID]
FROM [dbo].[Groups] AS [t0]

但是这个查询

From g In Db.Context.Current.Groups
Select g.GroupID, g.MemberCount

生成此SQL:

SELECT 
  [t0].[GroupID], [t0].[Title], [t0].[Description], ...
   -- 24 more fields - omitted for brevity 
FROM [dbo].[Groups] AS [t0]

g.MemberCountGroup类的一个返回整数的属性。

 Public ReadOnly Property MemberCount() As Integer
     Get
        Return (
            From cgx In KN.Db.Context.Current.ContactsGroupsXtabs
            Where cgx.GroupID = Me.GroupID
            Select cgx.ContactID
        ).Count()
     End Get
 End Property

我非常想只选择我需要的字段。如何说服LINQ to SQL不要选择所有列?

1 个答案:

答案 0 :(得分:1)

第一个查询中,LINQ to SQL知道 需要返回标量值GroupID(或{ {1}}数组)。这就是它的作用:LINQ to SQL只查询 数据库中的那个列并仅返回那些值。

GroupID

第二个查询中,LINQ to SQL知道它需要返回一个标量(与第一个查询相同),加上属性/方法调用在实际实体上返回的值实例,一个Group对象。因此,为了能够调用From g In Db.Context.Current.Groups Select g.GroupID ,首先必须有一个Group对象来调用它,对吧?因此,LINQ to SQL必须执行完整的实体提取,这就是它查询所有列的原因。

MemberCount()

[只是理论化......]你可能会说,但是From g In Db.Context.Current.Groups Select g.GroupID, g.MemberCount 'property/method call on an entity 不需要完整的实体获取,它不需要所有数据 - 它只需要MemberCount()。我会回答,LINQ to SQL如何知道? LINQ to SQL如何知道您的方法GroupID 依赖于其他基于db-column的属性的数据?它无法知道,所以它必须返回完整的对象。 [结束理论化。]

建议:在第二个查询中加入MemberCount(),在ContactsGroupsXtabs上加入群组并在群组上执行GroupID以获取您的价值。 (我可以通过你的其他SO问题和答案看到你知道怎么做所以我会跳过这个例子。)