从LINQ查询返回集合的类型

时间:2010-10-15 16:29:38

标签: vb.net linq entity-framework entity

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

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和实体框架。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

最好的类型是

IEnumerable<Account>

或VB中的相应语法:P

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

答案 2 :(得分:1)

IEnumerable<T>IQueryable<T>有一个很好的答案here

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

答案 3 :(得分:0)

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

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

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

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