我有一个方法,可以返回一组帐户
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和实体框架。
答案 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();