Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Linq中的左连接转换为内部连接_Asp.net_Sql Server_Linq_Sql Server 2008_Entity Framework - Fatal编程技术网

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
                     };