C# Linq上的左连接到实体问题
我需要从未分配的订单表中提取数据,并且分配的订单位于不同的表Orders\U assigned中。下面是我的Linq到实体代码 问题:我不仅仅得到未分配的订单,而是同时得到未分配和分配的订单。下面,linq代码存在问题,包括and子句{and[Extent2].[CHEM_ID]为NULL}。关于如何在linq to实体代码中获得正确sql的任何建议C# Linq上的左连接到实体问题,c#,sql-server,entity-framework,linq,left-join,C#,Sql Server,Entity Framework,Linq,Left Join,我需要从未分配的订单表中提取数据,并且分配的订单位于不同的表Orders\U assigned中。下面是我的Linq到实体代码 问题:我不仅仅得到未分配的订单,而是同时得到未分配和分配的订单。下面,linq代码存在问题,包括and子句{and[Extent2].[CHEM_ID]为NULL}。关于如何在linq to实体代码中获得正确sql的任何建议 var query = from objOrder in context.ORDERS j
var query = from objOrder in context.ORDERS
join objOrderAssigned in context.ORDERS_ASSIGNED
on new { key1 = objOrder.CHEM_ID, key2 = objOrder.ORDER_NBR } equals new { key1 = objOrderAssigned.CHEM_ID, key2 = objOrderAssigned.ORDER_NO } into temptbl
from temp in temptbl.DefaultIfEmpty()
where objOrder.ORDER_STATUS == "NEW"
select new Order
{
compoundid = temp.CHEM_ID,
orderno = objOrder.ORDER_NBR,
route = objOrder.ROUTE_CD,
};
当我查看SQL概要文件时,我看到其中一个where子句丢失了,并且不确定我在这里丢失了什么
SQL概要文件为上述Linq to实体代码生成的SQL:
生成正确数据的SQL
下面,linq代码存在问题,包括and子句{and[Extent2].[CHEM_ID]为NULL}
您忘记在LINQ查询where子句中包含null check。这里唯一具体的一点是,您不能检查temp.CHEM_ID属性,因为从C编译器的角度来看,它是不可为空的,所以您必须对temp对象应用检查,而EF足够聪明,可以将其转换为正确的SQL
以下是工作查询:
var query =
from objOrder in context.ORDERS
join objOrderAssigned in context.ORDERS_ASSIGNED
on new { key1 = objOrder.CHEM_ID, key2 = objOrder.ORDER_NBR }
equals new { key1 = objOrderAssigned.CHEM_ID, key2 = objOrderAssigned.ORDER_NO }
into assignedOrders
from objOrderAssigned in assignedOrders.DefaultIfEmpty()
where objOrder.ORDER_STATUS == "NEW" && objOrderAssigned == null
select new Order
{
compoundid = objOrder.CHEM_ID,
orderno = objOrder.ORDER_NBR,
route = objOrder.ROUTE_CD,
};
我相信当从左外置临时模式进行强制转换时,您应该在查询的select部分检查空值。有点像临时工!=无效的temp.CHEM_ID:null。@JanneP CHEM_ID是一个整数,不是null列。我不知道如何在Select中添加上面的行,因为它会抛出一个错误,指示它为null。我需要在where语句中包含AND子句。谢谢。我刚刚从objOrderAssigned==null更改为objOrderAssigned.CHEM_ID==null
SELECT
[Project1].[CHEM_ID] AS [CHEM_ID],
[Project1].[ORDER_NBR] AS [ORDER_NBR],
[Project1].[ROUTE_CD] AS [ROUTE_CD],
[Project1].[C1] AS [C1]
FROM ( SELECT
[Extent1].[CHEM_ID] AS [CHEM_ID],
[Extent1].[ORDER_NBR] AS [ORDER_NBR],
[Extent1].[ROUTE_CD] AS [ROUTE_CD],
N'' AS [C1]
FROM [dbo].[ORDERS] AS [Extent1]
LEFT OUTER JOIN [dbo].[ORDERS_ASSIGNED] AS [Extent2] ON ([Extent1].[CHEM_ID] = [Extent2].[CHEM_ID]) AND ([Extent1].[ORDER_NBR] = [Extent2].[ORDER_NO])
WHERE 'NEW' = [Extent1].[ORDER_STATUS]
and [Extent2].[CHEM_ID] IS NULL
) AS [Project1]
var query =
from objOrder in context.ORDERS
join objOrderAssigned in context.ORDERS_ASSIGNED
on new { key1 = objOrder.CHEM_ID, key2 = objOrder.ORDER_NBR }
equals new { key1 = objOrderAssigned.CHEM_ID, key2 = objOrderAssigned.ORDER_NO }
into assignedOrders
from objOrderAssigned in assignedOrders.DefaultIfEmpty()
where objOrder.ORDER_STATUS == "NEW" && objOrderAssigned == null
select new Order
{
compoundid = objOrder.CHEM_ID,
orderno = objOrder.ORDER_NBR,
route = objOrder.ROUTE_CD,
};