LINQ join 多了个 is null
我用的是Entity FrameWork 4.3
LINQ为      
var query = from v in
                             (from r in this.DbContxt.Tab_Purchaselist
                              join sr in this.DbContxt.Tab_Purchaseinfo
                                  on r.randid equals sr.randid into gc
                              from g in gc.DefaultIfEmpty()
                              select new
                                         {
                                             r.randid,
                                             r.purchaseOrderId,
                                             r.purchaseType,
                                             r.orderStatus,
                                             r.validEndDate,
                                             r.stockId,
                                             g.itemId,
                                             g.bookAmount
                                         }
                             )
                         where v.purchaseOrderId != null
                               && v.validEndDate > currentDate && v.purchaseType == 0
                               && v.stockId == dcId && orderStats.Contains(v.orderStatus)
                               && itemIds.Contains(v.itemId)
                         group v by v.itemId into  g
                         select new ItemOnLine
                       {
                           ItemId = g.Key,
                           OnLineNum = g.Sum(r => r.bookAmount)
                       };   
最后生成的SQL语句是
SELECT 1 AS C1, GroupBy1 . K1 AS itemId, GroupBy1 . A1 AS C2
   FROM (SELECT Extent2 . itemId AS K1, SUM(Extent2 . bookAmount) AS A1
           FROM tab_purchaselist AS Extent1
           LEFT OUTER JOIN tab_purchaseinfo AS Extent2
             ON (Extent1 . randid = Extent2 . randid)
             OR ((Extent1 . randid IS NULL) AND (Extent2 . randid IS NULL))
          WHERE (((((Extent1 . purchaseOrderId IS NOT NULL) AND
                (Extent1 . validEndDate > '2012-06-01 00:00:00')) AND
                (0 = (Extent1 . purchaseType))) AND
                (Extent1 . stockId = 10)) AND
                (((1 = Extent1 . orderStatus) OR (5 = Extent1 . orderStatus)) OR
                (((2 = Extent1 . orderStatus) OR
                (9 = Extent1 . orderStatus)) OR
                (10 = Extent1 . orderStatus))))        
          GROUP BY Extent2 . itemId) AS GroupBy1
在这个语句的 ON (Extent1 . randid = Extent2 . randid)
这个后面多了个  OR ((Extent1 . randid IS NULL) AND (Extent2 . randid IS NULL))
有什么办法去掉这个 or 因为这个or导致一个很奇怪的问题。所以想去掉
------解决方案--------------------
估计是gc.DefaultIfEmpty()引起的
------解决方案--------------------
你当前的是left join
换成 inner join 试试:
var query = from v in
 (from r in this.DbContxt.Tab_Purchaselist
 join sr in this.DbContxt.Tab_Purchaseinfo
 on r.randid equals sr.randid     
 select new
 {
 r.randid,
 r.purchaseOrderId,
 r.purchaseType,
 r.orderStatus,
 r.validEndDate,
 r.stockId,
 sr.itemId,
 sr.bookAmount
 }
 )
 where v.purchaseOrderId != null
 && v.validEndDate > currentDate && v.purchaseType == 0
 && v.stockId == dcId && orderStats.Contains(v.orderStatus)
 && itemIds.Contains(v.itemId)
 group v by v.itemId into g
 select new ItemOnLine
 {
 ItemId = g.Key,