Как бы я улучшил этот 7-строчный запрос Linq, который действует как спецификация?

BigQuery вверху получает набор продуктов и вложенных связанных таблиц. Затем я применяю фильтрацию в неудачной попытке создать шаблон спецификации. Это код фильтра. В запросе есть три таблицы, и я хочу отфильтровать верхний запрос по значению, вложенному в нижний запрос. Как я уже сказал, в настоящее время это дает желаемые результаты.

Однако .Contains() создает предложение SQL WHERE EXISTS() для каждого. Нам действительно нужен только один, но я не знаю, как заставить внутренний идентификатор сравниваться с внешним идентификатором.

from p in bigQuery                            // Root table
where ( from pp in p.LPP                      // Level 1 nested table
        where (from pv in pp.LPV              // Level 2 nested table 
               where pv.colorid == intValue   // Our filter value
               select p.id).Contains(p.id)    // Where exists
        select p.id).Contains(p.id)           // Where exists
select p;

Есть предположения? Это создает оператор SQL из 900 строк как есть, и пока у нас есть только один фильтр.


person Zachary Scott    schedule 03.11.2010    source источник
comment
Почему вы выбираете p.id в самом внутреннем запросе?   -  person leppie    schedule 03.11.2010
comment
Я подумал, что мне нужно что-то, что можно сравнить с внешним набором идентификаторов.   -  person Zachary Scott    schedule 03.11.2010
comment
Разве это не должно быть pv.id? В противном случае AFAIC увидит, что результат всегда будет верным.   -  person leppie    schedule 03.11.2010
comment
На самом деле, то же самое относится и к запросу вокруг него. Это может быть правильно, но мне кажется ошибкой. Убедитесь, что фильтр действительно фильтрует так, как задумано.   -  person leppie    schedule 03.11.2010
comment
Это определенно правильно фильтрует. Я не получаю 450 записей, которые находятся в исходном наборе, я получаю 130. Я проверил, что каждый идентификатор записи соответствует тому, что отображается в форме по сравнению с кодом SQL.   -  person Zachary Scott    schedule 03.11.2010


Ответы (1)


from p in bigQuery
where p.LPP.SelectMany(pv => pv.LVP).Any(x => x.colorid == intValue)
select p;

Из того, что я вижу, вышесказанное должно быть эквивалентно. Пожалуйста, попробуйте и проверьте сгенерированный SQL, если он работает. В любом случае, это не должно быть за горами.

person leppie    schedule 03.11.2010
comment
TYVM Улучшен оператор select на 100 строк. - person Zachary Scott; 03.11.2010