Кроме того, имеет ли значение порядок предложения 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.

Это верно?

0
colinfang 26 Авг 2011 в 14:18

2 ответа

Лучший ответ

Частично это будет зависеть от того, является ли это LINQ to Objects, LINQ to SQL и т. Д. Предположим, что LINQ to Objects.

Представьте себе этот сценарий:

  • A содержит 100 записей, 25 из которых соответствуют CriteriaA
  • B содержит 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. Очевидно, что для этого потребуется больше памяти, поскольку он должен кэшировать результаты.

5
Jon Skeet 26 Авг 2011 в 10:24

Я ожидал, что первый будет быстрее, потому что извлекается меньше данных.

Но это может зависеть от наборов данных, и, конечно, имеет значение, идет ли речь о IEnumerable<> или IQueryable<>.

Если действительно хотите знать: измерьте.

1
Henk Holterman 26 Авг 2011 в 10:19