我遇到了以(...).ToList().AsQueryable()结尾的linq查询。我分别知道.ToList()和.AsQueryable()的用法。但是,如果两者结合在一起会有什么结果呢?我们什么时候需要把它们组合起来?我希望这个问题不是一个太垃圾的问题。提前谢谢。
第一个查询:
Dim costAmounts = (From t In model.OrderTrades
Join o In model.Orders On t.OrdNum Equals o.OrdNum
Where o.ClientCode = clientNumber And o.BookDate = sysrec.ETicketsBookDate
Group t By t.Buy, t.OrdNum Into Amount = Sum(t.BuyAmount) _
Select OrdNum = OrdNum, Currency = Buy, SellAmount = Amount).ToList().AsQueryable()第二个查询:
Dim orders = (From a In costAmounts _
Group Join s In settlements On s.Currency Equals a.Currency _
And s.OrdNum Equals a.OrdNum Into amounts = Group _
From g In amounts.DefaultIfEmpty _
Where g Is Nothing OrElse a.SellAmount - g.Paid <> 0 _
Select OrdNum = a.OrdNum Distinct).ToList()发布于 2011-06-22 03:34:36
您永远不需要将这两者结合起来。
AsQueryable的存在是为了给你提供懒惰的评估特性,ToList完全否定了这一点。
因此,ToList强制对LINQ查询求值,然后将内存中的列表转换为IQueryable,以便允许...对它进行查询。而不是构造查询并仅根据需要获得结果。
发布于 2011-06-22 03:35:36
.ToList()将中断延迟的执行,这通常非常有用(传递可查询对象将延迟执行,但如果传递给多个类或方法,则可能最终实际执行几次)。一旦执行了.AsQueryable(),就可以将结果作为Queryable返回,这可能是必需的。
编辑:如果我们同意在queryable上调用.ToList(),然后传递列表对于某些用途来说是正确的模式(当queryable爆炸成多个变体,每个变体都需要在某个时刻执行时,我可以真正地加速您的应用程序)。如果您在某个时刻中断了延迟执行,那么从那里进行的查询将会更简单、更快--那么稍后调用.AsQueryable()只会达到将结果适合于特定类型(可能是某些api所需的)的目的。
https://stackoverflow.com/questions/6430936
复制相似问题