Как бы я улучшил этот 7-строчный Linq Query, который действует как Спецификация? - PullRequest
3 голосов
/ 03 ноября 2010

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 строк, и пока у нас есть только один фильтр.

1 Ответ

5 голосов
/ 03 ноября 2010
from p in bigQuery
where p.LPP.SelectMany(pv => pv.LVP).Any(x => x.colorid == intValue)
select p;

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

...