此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.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不要选择所有列?
答案 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问题和答案看到你知道怎么做所以我会跳过这个例子。)