использование .ToList (). AsQueryable () - PullRequest
3 голосов
/ 21 июня 2011

Я наткнулся на запрос 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 ]

3 голосов
/ 21 июня 2011

Вам никогда не нужно объединять эти два.

AsQueryable здесь, чтобы предоставить вам ленивые функции оценки, которые ToList полностью отрицает.

Итак, запрос LINQпринудительно оценивается ToList, затем список в памяти преобразуется в IQueryable, чтобы можно было ... выполнять запросы к нему.Вместо построения запроса и получения результатов только по мере необходимости.

1 голос
/ 21 июня 2011

.ToList () прервет отложенное выполнение, что часто очень полезно (передача запроса может задержать выполнение, но может закончиться выполнением нескольких исполнений позже, если они будут переданы нескольким классам или методам). Как только вы сделаете .AsQueryable (), вы вернете результат как Queryable, что может быть требованием.

РЕДАКТИРОВАТЬ: Если мы можем согласиться с тем, что вызов .ToList () для запрашиваемого, а затем передать список является правильным шаблоном для некоторых применений (я действительно могу ускорить ваше приложение в тех случаях, когда ваши запрашиваемые объекты разбиваются на несколько вариантов, каждый должен быть выполнен в какой-то момент). Если вы прервете отложенное выполнение в какой-то момент, ваши запросы оттуда будут упрощены и быстрее - тогда вызов .AsQueryable () позже будет служить только для подгонки результата к определенному (возможно, необходимому для некоторого API) типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...