Linq在c#中左连接查询

时间:2016-02-02 11:29:59

标签: c# linq

做一些事情linq离开了连接查询但面临一些问题。在sql查询后无法获得正确的结果需要转换为linq

INSERT INTO tbl_service_order_attributes_versioning(ServiceOrderNo, AttributeId, AttributeValue, parentid, AttributeType, Dt_Stamp, VERSION)
    SELECT 
        T.ServiceOrderNo, T.COIID, T.COI_Identifier, 
        @pid, 'MBM', getDate(), @ORDERVERSION 
    FROM 
        #temp1 T                                                    
    LEFT JOIN 
        tbl_service_order_attributes_versioning O WITH(NOLOCK) 
            ON T.ServiceOrderNo =  O.ServiceOrderNo COLLATE database_default
            AND T.COIID = O.AttributeID
            AND O.PARENTID = @pid  
    WHERE 
        O.ServiceOrderNo IS NULL  

我已将此查询转换为Linq查询:

var soiAttr = (from s in ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING
               where s.ParentId == parentId
               select s).ToList();

var resultJoinCOI = (from soaI in soiAttr
                     join iFoi in listFOI on soaI.ServiceOrderNo equals iFoi.fulfilmentOrderItemIdentifier
                     where iFoi.coiId == soaI.AttributeId && 
                           iFoi.parentId == parentId && 
                           soaI.ServiceOrderNo == null
                     select iFoi).ToList();

if (resultJoinCOI.Count > 0)
{
    var listToInsert = (from item in resultJoinCOI
                        select new TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING
                                    {
                                        ServiceOrderNo = item.fulfilmentOrderItemIdentifier,
                                        AttributeId = item.coiId,
                                        AttributeValue = item.coiIdentifier,
                                        ParentId = parentId,
                                        AttributeType = "MBM",
                                        DT_Stamp = DateTime.Now,
                                        VERSION = orderVersion
                                    });
                ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING.AddRange(listToInsert);
                ctxParser.SaveChanges();
            }

执行代码但结果不正确。

2 个答案:

答案 0 :(得分:1)

您需要使用DefaultIfEmpty(https://msdn.microsoft.com/en-us/library/bb360179.aspx)。以下是来自MSDN的阅读:https://msdn.microsoft.com/en-us/library/bb397895.aspx

在你的情况下,它会是这样的:

var resultJoinCOI = (
                from iFoi in listFOI
                join soaI in soiAttr on iFoi.fulfilmentOrderItemIdentifier equals soaI.ServiceOrderNo into res
                from subIFoi in res.DefaultIfEmpty()
                where iFoi.coiId == soaI.AttributeId && iFoi.parentId == parentId && subIFoi == null
                select iFoi).ToList();

答案 1 :(得分:0)

  

以下代码执行成功。并得到正确的结果。

 var soiAttr = (from s in ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING
                       where s.ParentId == parentId
                       select s).ToList();

 var resultJoinCOI = (from iFoi in listFOI
                             join soaI in soiAttr on
                             new
                             {
                                 ServiceOrderNo = iFoi.fulfilmentOrderItemIdentifier,
                                 AttributeId = iFoi.coiId
                             }
                             equals new
                             {
                                 ServiceOrderNo = soaI.ServiceOrderNo,
                                 AttributeId = soaI.AttributeId
                             }
                             into res
                             from subFoi in res.DefaultIfEmpty()
                             select new
                             {
                                 fulfilmentOrderItemIdentifier = iFoi.fulfilmentOrderItemIdentifier,
                                 coiId = iFoi.coiId,
                                 coiIdentifier = iFoi.coiIdentifier,
                                 AttributeId = subFoi == null ? 0 : subFoi.AttributeId,
                                 ParentId = subFoi == null ? parentId : subFoi.ParentId,  
                                 ServiceOrderNo = subFoi == null ? string.Empty: subFoi.ServiceOrderNo
                             });

  if (resultJoinCOI != null)
        {
            if (resultJoinCOI.Count() > 0)
            {
                var listToInsert = (from item in resultJoinCOI
                                    select new TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING
                                    {
                                        ServiceOrderNo = item.fulfilmentOrderItemIdentifier,
                                        AttributeId = item.coiId,
                                        AttributeValue = item.coiIdentifier,
                                        ParentId = parentId,
                                        AttributeType = "MBM",
                                        DT_Stamp = DateTime.Now,
                                        VERSION = orderVersion
                                    });
                ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING.AddRange(listToInsert);
                ctxParser.SaveChanges();
            }
        }
  

通过这种方式,我们可以在linq中实现左连接。按照上面的SQL Query(参见上面的sql语句)。