【问题标题】:Return Type for Collection from LINQ Query来自 LINQ 查询的集合的返回类型
【发布时间】:2010-10-15 16:29:38
【问题描述】:

我有一个方法,它返回一组帐户

Public Shared Function GetAllNotesByUser(ByVal UserID As Guid) As Account (??)
    Using db As New MyEntity
        Dim query= (From A In db.Account _
                    Where A.aspnet_Users.UserId = UserID _
                    Select A)
        Return query
    End Using
End Function

然后我想将它传递给另一个函数来计算集合中所有帐户的总数。返回一个通用列表 Ienumerable 是否是最佳实践,我只是不确定哪种方法最适合 LINQ 和实体框架。

【问题讨论】:

    标签: vb.net linq entity-framework entity


    【解决方案1】:

    以这种方式从方法传播 LINQ 查询结果时,对于 LINQ to 对象,返回类型的最佳选择是 IEnumerable(Of T),对于其他 LINQ 提供程序,最佳选择是 IQueryable(Of T)。在这种情况下,看起来 Account 是类型,所以 IEnumerable(Of Account) 或 IQueryable(Of T) 取决于所讨论的查询类型。

    【讨论】:

    • 最佳选择是IEnumerable,除非最佳选择是IQueryable。 ;)
    • @Kirk,真的。忘记了非 LINQ 到对象查询的情况
    【解决方案2】:

    最好的类型是

    IEnumerable<Account>
    

    或VB中对应的语法:P

    实际上,所有 LINQ 函数(.Where()、.Distinct() 等)都是 IEnumerable&lt;T&gt; 的扩展方法,我认为以同样的方式继续链是一种很好的做法。

    【讨论】:

    • 我搜索了 MSDN,但一定是找错地方了。你怎么知道 WHERE() 和 Distinct() 是 IEnumerable 的扩展方法。我不是在问你,我只是想知道下次遇到类似问题时该去哪里。
    • @Travis 没问题。实际上在 MSDN 中,定义这些扩展方法的“位置”并不是很明显......但您可以在页面上找到IEnumerable&lt;T&gt;(通用版本)的列表:msdn.microsoft.com/en-us/library/9eekhta0.aspx。有一个小图标表示它是一种扩展方法...当您单击其中一个时,您可以看到它位于哪个命名空间中...也就是说,为了使用任何 LINQ 扩展方法,您需要在文件顶部有using System.Linq;。
    • 哦,我知道的方式只是因为 VS 总是添加对 System.Linq 的引用,而 Intellisense 只是建议它们 :-) 。在底层,所有“linq”类查询表达式都被转换为 Linq 扩展方法链。
    • 现在我想起来了,我认为一些 Ling 方法扩展适用于 IEnumerable&lt;T&gt;,但有些适用于 IQueryable&lt;T&gt;
    【解决方案3】:

    here IEnumerable&lt;T&gt; vs IQueryable&lt;T&gt; 有一个很好的答案。

    如果您想进一步限制方法调用者中的集合,例如使用 WHERE 子句,我会使用 IQueryable(Of T)。否则我会使用IEnumerable(Of T),如果所有调用者都知道如果他们计划多次迭代结果,他们需要对结果执行 ToList() (否则你会对数据库进行多次调用)。如果调用者不知道,我可能会使用 ICollection(Of T) 并在方法本身中执行 ToList()。

    【讨论】:

      【解决方案4】:

      您需要问的问题是:“我什么时候需要实际执行 SQL?”在 LINQ 中,这是延迟执行和立即执行之间的区别。任何返回 IEnumerable&lt;&gt; 的方法都必须执行查询才能获得结果。另一方面,IQueryable&lt;&gt; 会延迟查询的执行,直到针对它调用返回 IEnumerable&lt;&gt; 的方法。在您提供的示例中,将GetAllNotesByUser 函数的结果作为IQueryable&lt;&gt; 传递可能会更快,这样您就可以运行一个查询而不是两个:

      public static IQueryable<Account> GetAllNotesByUser(Guid UserId)
      {
          ...
      }
      

      在某些情况下,您可能需要枚举GetAllNotesByUser 的结果而不执行任何其他操作。在这些情况下,请记住您可以调用“ToList()”来强制执行查询。

      var result = GetAllNotesByUser(<guid>).ToList();
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2010-11-06
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多