Asp.net Linq中的左连接转换为内部连接
我有两张桌子:Asp.net Linq中的左连接转换为内部连接,asp.net,sql-server,linq,sql-server-2008,entity-framework,Asp.net,Sql Server,Linq,Sql Server 2008,Entity Framework,我有两张桌子: 产品代码: Code Year PageNo ----------------------------------------- 和成本: Code Year City QsNo price ---------------------------------------------------------------- 我想保留特定年份页码中的所有代码
产品代码
:
Code Year PageNo
-----------------------------------------
和成本
:
Code Year City QsNo price
----------------------------------------------------------------
我想保留特定年份页码中的所有代码,然后显示特定年份城市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
};
但它会转换为内部联接
。问题在哪里?问题是,在联接后,您正在检查输出
变量上的年份、城市和QsNo。。。但如果输出为null(如果AllCosts中没有行,则会发生这种情况),那么这些检查将始终为false,因此where子句将过滤掉该对(代码,输出)。EF检测到这一事实并生成一个查询,该查询只需使用一个内部连接就可以更高效地执行
您真正想要做的是从成本中筛选出候选行,而不是筛选(代码、成本)对。为此,您可以向上移动过滤器,使其直接应用于成本表:
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
};