2010-10-15 43 views
2

这的LINQ to SQL查询LINQ to SQL mystery:为什么查询在某些情况下包含所有字段,但不包括其他字段?

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.MemberCount是返回整数的Group类的属性。

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

在你第一个查询,LINQ to SQL的知道它只有需要返回一个标值GroupID(或GroupID阵列)。所以这就是它的作用:LINQ to SQL查询只有该数据库中的列,并且只返回那些值。

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

在你第二查询,LINQ到SQL知道它需要在实际的实体实例返回标(同第一个查询),加上值由属性/方法调用返回,一个Group对象。所以,为了能够拨打MemberCount(),必须首先有一个Group对象来调用它,对吧?因此,LINQ to SQL必须执行完整的实体提取,这就是查询所有列的原因。

From g In Db.Context.Current.Groups 
Select g.GroupID, g.MemberCount 'property/method call on an entity 

[只是理论化在这里......]你可能会说,但MemberCount()并不需要一个完整的实体获取,它并不需要所有的数据 - 它需要的只是GroupID。我会回答,LINQ to SQL如何知道这一点? LINQ to SQL如何知道你的方法MemberCount()不是依赖于其他基于db-column的属性的数据?它不知道,所以它必须返回完整的对象。 [结束的理论。]

建议:在你的第二个查询,组上GroupID加入ContactsGroupsXtabs并在组办一个Count()让你的价值。 (我可以看到你的其他问题和答案,你知道如何做所有这些,所以我会跳过这个例子。)

+0

很好的答案,@shaunmartin。这很有道理。 – 2010-10-26 12:59:55

相关问题