2015-10-16 39 views
0

我創建了一個EF Join。 frameStart有19條記錄,frameEnd有42條記錄,但是當我做連接時(framing),只有10條記錄。我相信只有10條記錄,因爲它正在連接可以用匹配鍵組合的記錄。代碼如下。我如何做到這一點,以便在加入時,我可以得到所有記錄的列表,甚至是那些不匹配的記錄?C#EntityFramework加入所有記錄

public class s84_Report_FrameLabor 
{ 
    public int CustomerID { get; set; } 
    public string CustomerName { get; set; } 
    public int SubdivisionID { get; set; } 
    public string SubdivisionName { get; set; } 
    public int LotNumber { get; set; } 
    public string InstallManagerStart { get; set; } 
    public string InstallManagerComplete { get; set; } 
    public DateTime FrameLaborStart { get; set; } 
    public DateTime FrameLaborComplete { get; set; } 
    public int Duration { get; set; } 

    /* 
     Frame Labor Start ------ Product ID: 26 
     Frame Labor Complete ------ Product ID: 8 
    */ 

    public static List<s84_Report_FrameLabor> getDurationReport() 
    { 
     using (var context = PrimaryConnection.returnNewConnection()) 
     { 
      var frameStart = (from c in context.s84_Schedule 
          where c.ProductID == 26 && c.Completed == false 
          select new 
          { 
           CustomerID = c.CustomerID, 
           CustomerName = c.s84_Customer.CustomerName, 
           SubdivisionID = c.SubdivisionID, 
           SubdivisionName = c.s84_Subdivision.SubdivisionName, 
           LotNumber = c.LotNumber, 
           FrameLaborStart = c.CustomerExpectedDate 
          }).ToList(); 

      var frameEnd = (from c in context.s84_Schedule 
          where c.ProductID == 8 && c.Completed == false 
          select new 
          { 
           CustomerID = c.CustomerID, 
           SubdivisionID = c.SubdivisionID, 
           LotNumber = c.LotNumber, 
           FrameLaborComplete = c.CustomerExpectedDate 
          }).ToList(); 

      var framing = from c in frameStart 
          join e in frameEnd on new { c.CustomerID, c.SubdivisionID, c.LotNumber } equals new { e.CustomerID, e.SubdivisionID, e.LotNumber } 
          select new s84_Report_FrameLabor 
          { 
           CustomerID = c.CustomerID, 
           CustomerName = c.CustomerName, 
           SubdivisionID = c.SubdivisionID, 
           SubdivisionName = c.SubdivisionName, 
           LotNumber = c.LotNumber, 
           FrameLaborStart = c.FrameLaborStart, 
           FrameLaborComplete = e.FrameLaborComplete, 
           Duration = (e.FrameLaborComplete - c.FrameLaborStart).Days 
          }; 

      return framing.ToList(); 
     } 
    } 
} 
+0

搜索實體框架左連接,你會發現DefaultIfEmpty函數。這應該可以解決你的問題。 – Andre

+0

例如[左外連接LINQ to Entities](http://www.progware.org/Blog/post/Left-Outer-Join-in-LINQ-to-Entities-%28for-Entity-Framework-4%29 .aspx) – stuartd

+0

是的。聽起來就像你想要一個左連接。查看[LINQ中的左外連接](http://stackoverflow.com/questions/3404975/left-outer-join-in-linq)。我特別喜歡這個答案,「可讀性更好的左外連接可以這樣寫」。 –

回答

1

感謝安德烈,stuartd,和詹姆斯R.,我找到了解決辦法是使用的EntityFramework DefaultIfEmpty()

  var framing = from c in frameStart 
          join e in frameEnd on new { c.CustomerID, c.SubdivisionID, c.LotNumber } equals new { e.CustomerID, e.SubdivisionID, e.LotNumber } into jointable 
          from z in jointable.DefaultIfEmpty() 
          select new s84_Report_FrameLabor 
          { 
           CustomerID = c.CustomerID, 
           CustomerName = c.CustomerName, 
           SubdivisionID = c.SubdivisionID, 
           SubdivisionName = c.SubdivisionName, 
           LotNumber = c.LotNumber, 
           FrameLaborStart = c.FrameLaborStart, 
           FrameLaborComplete = z.FrameLaborComplete, 
           Duration = c.FrameLaborStart == null ? z.FrameLaborComplete == null ? (z.FrameLaborComplete - c.FrameLaborStart).Days : 0 : 0 
          }; 

      return framing.ToList();