0

我有两张桌子:

ProductCodes

Code             Year             PageNo
-----------------------------------------

Costs

Code             Year         City         QsNo            price
----------------------------------------------------------------

我想保留特定的所有代码,year-pageNo然后显示特定的成本year-city-Qsno(如果存在)和不存在的成本,我返回 null。

我写了这个查询:

var Result = from code in ent.ProductCodes
                         join cost in ent.Costs
                           on new { a = code.Year, b = code.Code } equals new { a = cost.Year, b = cost.Code }
                           into AllCosts
                         from OutPut in AllCosts.DefaultIfEmpty()
                         where code.PageNo == PageNo && OutPut.Year == Year && OutPut.City == City && OutPut.QsNo == Qsno
                         select new
                         {
                             ProductCode = code.Code
                             Col6 = OutPut.Price
                         };

但它转换为INNER JOIN。问题出在哪里?

4

1 回答 1

1

问题是您在OutPut连接后检查变量上的 Year、City 和 QsNo...但是如果 OutPut 为 null(如果 AllCosts 中没有行会发生这种情况),那么这些检查将始终为 false,所以对 (code, OutPut) 将被 where 子句过滤掉。EF 检测到这一事实并生成一个查询,该查询仅通过使用内连接来更有效。

您真正想要做的是从成本中过滤掉候选行,而不是过滤(代码、成本)对。为此,您可以向上移动过滤器,使其直接应用于 Costs 表:

var Result = from code in ent.ProductCodes
                     join cost 
                       in ent.Costs.Where(c => c.Year == Year && c.City == City && c.QsNo == Qsno)
                       on new { code.Year, code.Code } equals new { cost.Year, cost.Code }
                       into AllCosts
                     from OutPut in AllCosts.DefaultIfEmpty()
                     where code.PageNo == PageNo
                     select new
                     {
                         ProductCode = code.Code
                         Col6 = OutPut.Price
                     };
于 2013-09-15T15:41:02.380 回答