Кроме того, имеет ли значение порядок предложения where?
from x in A.where(x=>CriteriaA(x))
from y in B where(y=>CriteriaB(y))
where CriteriaC(x,y)
from x in A
from y in B
where(x=>CriteriaA(x))
where(y=>CriteriaB(y))
where CriteriaC(x,y)
from x in A
from y in B
where(y=>CriteriaB(y))
where(x=>CriteriaA(x))
where CriteriaC(x,y)
Обновление : все это IEnumerable <> и Linq to Objects
Используйте сценарий Джона Скита: A имеет 100 записей, 25 из которых соответствуют CriteriaA B имеет 100 записей, 50 из которых соответствуют CriteriaB
1-й первый метод, будет 100 вызовов CriteriaA
, 2500 вызовов CriteriaB
и 1250 вызовов CriteriaC
.
2-й метод, будет 10000 вызовов CriteriaA
, 2500 вызовов CriteriaB
и 1250 вызовов CriteriaC
.
3-й метод, будет 10000 вызовов для CriteriaB
, 5000 вызовов для CriteriaA
и 1250 вызовов для CriteriaC
.
Это верно?
2 ответа
Частично это будет зависеть от того, является ли это LINQ to Objects, LINQ to SQL и т. Д. Предположим, что LINQ to Objects.
Представьте себе этот сценарий:
A
содержит 100 записей, 25 из которых соответствуют CriteriaAB
содержит 100 записей, 50 из которых соответствуют CriteriaB
Затем в первом сценарии будет 100 вызовов CriteriaA, 2500 вызовов CriteriaB и 1250 вызовов CriteriaC.
Во втором сценарии будет 10 000 вызовов CriteriaA, 2500 вызовов CriteriaB и 1250 вызовов CriteriaC.
Если вы "материализуете" результаты одного вызова Where
следующим образом:
var resultsB = B.Where(y => CriteriaB(y)).ToList();
from x in A.Where(x => CriteriaA(x)).ToList()
from y in resultsB
where CriteriaC(x,y)
Затем будет 100 вызовов CriteriaA, 100 вызовов CriteriaB и те же 1250 вызовов CriteriaC. Очевидно, что для этого потребуется больше памяти, поскольку он должен кэшировать результаты.
Я ожидал, что первый будет быстрее, потому что извлекается меньше данных.
Но это может зависеть от наборов данных, и, конечно, имеет значение, идет ли речь о IEnumerable<>
или IQueryable<>
.
Если действительно хотите знать: измерьте.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.