Это выражение запроса 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
...