Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Снова LINQ

216  
Murr_0002 постоялец09.06.17 14:09
Murr_0002
09.06.17 14:09 

Снова LINQ


Имею код:


foreach (TNUM_KREIS.Row department in pNUM_KREIS)
{
var range = from piece in this.Cast<Row>()
where piece.OrderNo > department.StartNo && piece.OrderNo < department.FinishNo
select piece;
foreach(Row row in range)
{
row.Department = department.Department;
}
}

Код находится внутри класса представляющего таблицу т.е. имеющего итератор по строкам.

Требуется - прописать в каждую строку Департамент из списка pNUM_KREIS

Критерий - нахождение OrderNo в соответствующем диапазоне.


Вот что-то не выходит. Т.е. для ВСЕХ выдается один (или первый, или последний) Департамент.


Понимаю, что проблема связана с отложенностью вычислений ЛИНКа, но не вижу как решать.

Пните, плс, в нужном направлении.


П.С. Инет рыл - имплементации Беттвеен - нашел. Не нашел как завязать на два источника.

#1 
NightWatch коренной житель09.06.17 15:28
NightWatch
NEW 09.06.17 15:28 
в ответ Murr_0002 09.06.17 14:09
Понимаю, что проблема связана с отложенностью вычислений ЛИНКа,

А мне не понятно. Пояснишь?

#2 
Murr_0002 постоялец09.06.17 15:35
Murr_0002
NEW 09.06.17 15:35 
в ответ NightWatch 09.06.17 15:28

Отбой тревоги - нашел ошибку в бизнес объекте. безум


Пояснишь?

-----

Хммм... В ЛИНКе вычисление выражения происходит не в момент его определения, а в момент его использования.

Ну, соответственно, бывают непонятки - вроде как выражение определено при каких-то значениях параметров,

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

Думал что это как-то создавало проблему в моем случае.

Но все оказалось проще - в ноябре 2016 срочно переключили с этой задачи на что-то еще и бизнес-объект остался

недоделанным - два поля брались не оттуда откуда надо. Одно из них - ОрдерНо...

#3 
NightWatch коренной житель09.06.17 15:55
NightWatch
NEW 09.06.17 15:55 
в ответ Murr_0002 09.06.17 15:35, Последний раз изменено 09.06.17 15:56 (NightWatch)
В ЛИНКе вычисление выражения происходит не в момент его определения, а в момент его использования.

Это я знаю. Хотелось услышать, как это могло (бы) оказать влияние в твоем куске кода.

#4 
Murr_0002 постоялец09.06.17 17:17
Murr_0002
NEW 09.06.17 17:17 
в ответ NightWatch 09.06.17 15:55

как это могло (бы) оказать влияние в твоем куске кода.

-----

Я думал, что могло.

Бо, оно всегда так когда работаешь с малознакомой областью - может - это, может - то.

Но баг был не там.

А результат бага был похож на то что вычисления делаются с одним и тем же значением.

Отсюда и предположение.

#5 
  moose свой человек11.06.17 22:43
NEW 11.06.17 22:43 
в ответ Murr_0002 09.06.17 15:35
не в момент его определения, а в момент его использования.

а если вообще "на пальцах"? что такое "определение", и что такое "использование"? в идеале - линк на источник на английском.

#6 
Murr_0002 постоялец12.06.17 02:08
Murr_0002
NEW 12.06.17 02:08 
в ответ moose 11.06.17 22:43

TNUM_KREIS.Row department; var range = from piece in this.Cast<Row>()
where piece.OrderNo > department.StartNo && piece.OrderNo < department.FinishNo
select piece; foreach (TNUM_KREIS.Row d in pNUM_KREIS) {

department = d;

foreach(Row row in range)

{

row.Department = department.Department;

}

}


Еще подробнее или уже разберешься?

#7 
  moose свой человек12.06.17 13:22
NEW 12.06.17 13:22 
в ответ Murr_0002 12.06.17 02:08

Ваш код я вообще не собираюсь смотреть. Я просил пояснить, что означает сказанное Вами (см мой пост). А Вы, похоже, сами не понимаете, что написали извините за беспокойство.

#8 
BlauerKarter34 знакомое лицо12.06.17 14:07
NEW 12.06.17 14:07 
в ответ moose 11.06.17 22:43

Ищем по Deferred Execution and Lazy Evaluation in LINQ


#9 
  moose свой человек12.06.17 18:37
NEW 12.06.17 18:37 
в ответ BlauerKarter34 12.06.17 14:07

Спасибо. Я, честно говоря, не знал, что это так обстоит. Думал, что это только в случае передачи функций в качестве аргументов методов. Но механизм тот же самый, и может как облегчить жизнь, так и испортить, если применить в неправильном месте.

#10 
BlauerKarter34 знакомое лицо12.06.17 22:23
NEW 12.06.17 22:23 
в ответ moose 12.06.17 18:37

ReSharper в помощь ) Он советует привести результаты LINQ к коллекции, чтобы избежать неоднократного получения результата.

#11