Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
C# Linq上的左连接到实体问题_C#_Sql Server_Entity Framework_Linq_Left Join - Fatal编程技术网

C# Linq上的左连接到实体问题

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

我需要从未分配的订单表中提取数据,并且分配的订单位于不同的表Orders\U assigned中。下面是我的Linq到实体代码

问题:我不仅仅得到未分配的订单,而是同时得到未分配和分配的订单。下面,linq代码存在问题,包括and子句{and[Extent2].[CHEM_ID]为NULL}。关于如何在linq to实体代码中获得正确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 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,
    };