2016-11-17 94 views
1

我需要从Orders表中提取数据,这些数据未分配并且分配的订单位于不同的表Orders_Assigned中。以下是我的Linq to Entity Code。Linq to Entity问题的左连接


问题:我没有得到公正的未分配的订单,而它得到双方未分配和分配的订单。在linq代码下面有问题,包括和子句{和[范围2]。[CHEM_ID] IS NULL}。有关如何在linq中将正确的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到实体代码

SQL :

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] 
) AS [Project1] 

SQL产生正确的数据

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] 
+0

我相信从左至右outered临时投放时,你应该在你查询的选择部分检查空值。像(temp!= null)这样的东西? temp.CHEM_ID:null。 – JanneP

+0

@JanneP CHEM_ID是一个整数而非空列。我不知道如何在Select中添加上面的行,因为它会抛出一个错误,指示它为空。我需要在where语句中包含AND子句。 – user6747972

回答

1

下面的linq代码有问题,包括和子句{和[范围2]。[CHEM_ID] IS NULL}。

您忘记了包含null检查LINQ查询where子句。这里唯一具体的是你不能检查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, 
    }; 
+0

谢谢你的摇滚。我刚刚从objOrderAssigned == null更改为objOrderAssigned.CHEM_ID == null – user6747972