Как бих подобрил тази 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 Подобри оператора за избор със 100 реда - person Zachary Scott; 03.11.2010