使用.ToList()。AsQueryable()

时间:2011-06-21 19:31:03

标签: linq-to-sql

我遇到了以(...)结尾的linq查询.ToList()。AsQueryable()。我分别知道.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()

2 个答案:

答案 0 :(得分:3)

你永远不需要将两者结合起来。

AsQueryable可以为您提供懒惰的评估功能,ToList完全否定了这些功能。

因此,ToList强制要求LINQ查询进行评估,然后将内存列表转换为IQueryable以允许...查询它。而不是构建查询,只根据需要获得结果。

答案 1 :(得分:1)

.ToList()会破坏延迟执行,这通常非常有用(传递可查询的内容将推迟执行,但如果传递给多个类或方法,最终可能会在以后实际执行多次执行)。一旦你执行了.AsQueryable(),你就可以将结果作为Queryable返回,这可能是一个要求。

编辑:如果我们同意在可查询上调用.ToList(),然后传递列表是适合某些用途的模式(我可以真正加快你的应用程序,在你的查询可能爆炸成多个变种的情况下, 每个需要在某个时刻执行)。如果你在某个时刻中断延迟执行,你的查询将会更简单,更快 - 然后调用.AsQueryable()以后只会将结果用于特定的(可能需要某些api)类型。