2009-09-08 74 views
1

此LINQ查询表达式会发出左的连接和工作原理:LINQ to SQL - 如何将where子句添加到左连接?

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子句不被“pip”所接受,并且在DefaultIfEmpty()之前的lambda表达式不起作用。我知道我可以在选择过滤出来,但那不是我需要的。

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 

更新 Oy公司合租的,我的错误,where子句做工作 - 由于某种原因,VS2008并没有表现并给我的悲伤,我的肚子咆哮。我在LinqPad中测试过,where子句很好。所以这一点除了没有工作:

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

回答

6

下面是如何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 
    }