使用.ToListAsQueryable

问题描述

| 我遇到了以(...)。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()
    

解决方法

        您永远不需要将两者结合起来。
AsQueryable
可以为您提供懒惰的评估功能,
ToList
则完全无效。 因此,LINQ查询被强制由
ToList
求值,然后,内存中列表被转换为
IQueryable
以允许...对其进行查询。而不是构造查询并仅根据需要获取结果。     ,        .ToList()会中断延迟的执行,这通常非常有帮助(传递可查询的内容会延迟执行,但是如果传递给多个类或方法,则可能最终实际上会在以后执行多次执行)。完成.AsQueryable()之后,然后将结果作为Queryable返回,这可能是必需的。 编辑:如果我们可以同意在一个可查询对象上调用.ToList(),然后将列表传递给某些用途,则是正确的模式(在您的可查询对象爆炸成多个变体的情况下,我真的可以加速您的应用程序,每个需要在某个时候执行)。如果您在某个时候中断了延迟的执行,那么从那里开始的查询将得到简化和更快-然后稍后调用.AsQueryable()仅用于将结果适合特定的类型(可能是某些api所需)的目的。