LEFT LINQ TO SQL C#加入多对多表

时间:2013-02-09 12:45:59

标签: c# linq linq-to-sql many-to-many

嗨我有点新的linq to sql我知道基础知识。问题是我想在查询中进行左连接。查询中有3个表。

  
      
  1. 索赔人(应从此表中返回所有行)
  2.   
  3. 声明
  4.   
  5. 用户
  6.   

查询应返回所有拥有索赔人的用户。这是通过多对多表声明完成的。但无论用户如何,所有索赔人都应退回。因此左边加入了索赔人。

我有以下查询

    var d = (from Claimants in DB.Claimants
                 join Claims in DB.Claims on Claimants.Claiment_ID equals Claims.Claiment_ID
                 join Users in DB.Users on Claims.User_ID equals Users.User_ID
                 where (Claimants.TrialDate.Value >= dtDayStart & Claimants.TrialDate <= dtDayEnd)
                 select new
                 {
                     ClaimantFirstName = Claimants.FirstName,
                     ClaimantLasname = Claimants.LastName,
                     ClaimantsID = Claimants.IDNumber,
                     Claimants.OurReference,
                     Claimants.TrialDate,
                     InterviewStart = Claims.DateTimeStart,
                     InterviewEnd = Claims.DateTimeEnd,
                     Claims.Priority,
                     UserFirstname = Users.FirstName,
                     UserLastName = Users.LastName,
                     UserID = Users.IDNumber
                 });

我尝试使用如下的into语句,但没有运气

        var d = (from Claimants in DB.Claimants
                 join Claims in DB.Claims on Claimants.Claiment_ID equals Claims.Claiment_ID
                 into TheClaimants
                 from Claims in TheClaimants.DefaultIfEmpty()

                 join Users in DB.Users on Claims.User_ID equals Users.User_ID
                 where (Claimants.TrialDate.Value >= dtDayStart & Claimants.TrialDate <= dtDayEnd)
                 select new
                 {
                     ClaimantFirstName = Claimants.FirstName,
                     ClaimantLasname = Claimants.LastName,
                     ClaimantsID = Claimants.IDNumber,
                     Claimants.OurReference,
                     Claimants.TrialDate,
                     InterviewStart = Claims.DateTimeStart,
                     InterviewEnd = Claims.DateTimeEnd,
                     Claims.Priority,
                     UserFirstname = Users.FirstName,
                     UserLastName = Users.LastName,
                     UserID = Users.IDNumber
                 });

如果有人能指出我正确的方向如何正确使用这些连接并解释工作原理,我将不胜感激。非常感谢你提前。

3 个答案:

答案 0 :(得分:1)

var d = (from Claimants in DB.Claimants
  join Claims in DB.Claims on Claimants.Claiment_ID equals Claims.Claiment_ID)
  .DefaultIfEmpty()
  join Users in DB.Users on Claims.User_ID equals Users.User_ID
  where (Claimants.TrialDate.Value >= dtDayStart & Claimants.TrialDate <= dtDayEnd)
  .DefaultIfEmpty()
  select new
  {
    ClaimantFirstName = Claimants.FirstName,
    ClaimantLasname = Claimants.LastName,
    ClaimantsID = Claimants.IDNumber,
    Claimants.OurReference,
    Claimants.TrialDate,
    InterviewStart = Claims.DateTimeStart,
    InterviewEnd = Claims.DateTimeEnd,
    Claims.Priority,
    UserFirstname = Users.FirstName,
    UserLastName = Users.LastName,
    UserID = Users.IDNumber
 });

Left outter join

答案 1 :(得分:0)

你必须知道栾。如果您希望所有索赔人通过从Claimant's选择返回开始,然后将其连接到其他表格。

尝试以下方法:

LINQ to SQL Left Outer Join

答案 2 :(得分:0)

在LINQ中,“.Join()”扩展方法相当于SQL 内连接

对于外部联接,您必须使用“.GroupJoin()”扩展方法。

假设你很了解.Join,GroupJoin很容易使用。我不得不承认,当我第一次需要在LINQ中进行外连接时,很难找到。我无法想象为什么他们这样称呼它。

虽然在VB.Net中,这篇文章提供了翻译成LINQ语法的各种SQL结构,即使在VB中,仍然很容易转换为扩展方法:http://blogs.msdn.com/b/vbteam/archive/2007/12/31/converting-sql-to-linq-part-6-joins-bill-horst.aspx?Redirected=true

编辑:@DavidB在他的评论中发布了一个更好的解决方案,但前提是你可以使用一些ORM导航属性。如果你没有它们,那么GroupJoin可能是最合理的