代码之家  ›  专栏  ›  技术社区  ›  Herb Caudill

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

  •  2
  • Herb Caudill  · 技术社区  · 14 年前

    此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
    

    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 回复  |  直到 14 年前
        1
  •  1
  •   shaunmartin    14 年前

    在你的 第一个查询 只有 GroupID (或 组ID 只有 数据库中的列,只返回那些值。

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

    第二个查询 ,LINQ to SQL知道它需要返回标量(与第一个查询相同), 加上对实际实体实例的属性/方法调用返回的值 MemberCount() 必须首先有一个组对象来调用它,对吗?所以LINQ to SQL必须执行完整的实体获取,这就是它查询所有列的原因。

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

    [这里只是理论…]你可能会说,但是 成员计数() 组ID . 我会回答,LINQ to SQL怎么知道呢?LINQ to SQL如何知道您的方法 是否依赖于其他基于db列的属性的数据?它不知道,所以它必须返回完整的对象。[结束理论化]

    建议: ContactsGroupsXtabs 在您的第二个查询中,group on 然后做一个 Count() 为了得到你的价值。(我可以从你的其他问题和答案中看出,你知道如何做到这一切,所以我将跳过这个例子。)