LINQ to SQL - как добавить предложение where к левому соединению?

Это выражение запроса LINQ создает левое соединение и работает:

from p in Prices
join ip in ItemPrices 
    on new { p.PriceId,  ItemId = 7 } equals 
       new { ip.PriceId, ip.ItemId }
into priceItemPrice
from pip in priceItemPrice.DefaultIfEmpty()
select new
{
    pricesPriceId = p.PriceId,
    z = (int?)pip.PriceId,
    p.Content,
    p.PriceMinQ
}

Выпущено SQL:

-- Region Parameters
DECLARE @p0 Int = 7
-- EndRegion
SELECT [t0].[priceId] AS [pricesPriceId], 
    [t1].[priceId] AS [z], 
    [t0].[price] AS [Content], 
    [t0].[priceMinQ] AS [PriceMinQ]
FROM [price] AS [t0]
LEFT OUTER JOIN [itemPrice] AS [t1] 
    ON ([t0].[priceId] = [t1].[priceId]) 
    AND (@p0 = [t1].[itemId])

Как я могу заставить его выдать SQL, указанный ниже? К нему просто прикреплен пункт where. Предложение where не принимается в «from pip», а лямбда-выражение where до DefaultIfEmpty () не работает. Я знаю, что могу отфильтровать это при выборе, но это не то, что мне нужно.

SELECT [t0].[priceId] AS [pricesPriceId], 
    [t1].[priceId] AS [z], 
    [t0].[price] AS [Content], 
    [t0].[priceMinQ] AS [PriceMinQ]
FROM [price] AS [t0]
LEFT OUTER JOIN [itemPrice] AS [t1] 
    ON ([t0].[priceId] = [t1].[priceId]) 
    AND (@p0 = [t1].[itemId])
WHERE [t1].[priceId] is null

Обновление Ой, вей, моя ошибка, пункт where действительно сработал - по какой-то причине VS2008 не вела себя и не доставляла мне горя, и у меня урчало в животе. Я тестировал еще раз в LinqPad, и предложение where было в порядке. Итак, это небольшое дополнение действительно сработало:

...
from pip in priceItemPrice.DefaultIfEmpty()
*** where pip.ItemId == null ***
select new
...

person Steve    schedule 08.09.2009    source источник


Ответы (1)


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

var query =  p in Prices
   join ip in ItemPrices 
   on 
   new { p.PriceId,  ItemId = 7 } 
   equals 
   new { ip.PriceId, ip.ItemId }
   into priceItemPrice
   from pip in priceItemPrice.DefaultIfEmpty()
   select new
   {
      pricesPriceId = p.PriceId,
      z = (int?)pip.PriceId,
      p.Content,
      p.PriceMinQ
   }
person RSolberg    schedule 08.09.2009