左LINQ到SQL C#在多对多表上联接

左LINQ到SQL C#在多对多表上联接,c#,linq,linq-to-sql,many-to-many,C#,Linq,Linq To Sql,Many To Many,嗨,我是linq to sql的新手,我知道一些基础知识。问题是我想在查询中进行左连接。查询中有3个表 索赔人(应从此表返回所有行) 主张 使用者 查询应返回拥有索赔人的所有用户。这是通过多对多表声明完成的。但是,不管用户是谁,所有索赔人都应该被退回。因此,左翼加入了索赔者的行列 我有以下疑问 var d = (from Claimants in DB.Claimants join Claims in DB.Claims on Claimants.Cla

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

  • 索赔人(应从此表返回所有行)
  • 主张
  • 使用者
  • 查询应返回拥有索赔人的所有用户。这是通过多对多表声明完成的。但是,不管用户是谁,所有索赔人都应该被退回。因此,左翼加入了索赔者的行列

    我有以下疑问

        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
                     });
    
    var d=(来自DB中的索赔人)
    在DB中加入索赔。索赔人的索赔。索赔人ID等于索赔人ID
    在DB中加入用户。声明中的用户。用户ID等于用户。用户ID
    
    其中(Claiments.TrialDate.Value>=dtDayStart&Claiments.TrialDate=dtDayStart&Claiments.TrialDate您必须知道一个Luan。如果希望所有Claiments通过从Claiments中选择返回start,然后左键连接到其他表

    请尝试以下操作:

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

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

    假设你知道.Join,那么GroupJoin很容易使用。我必须承认,当我第一次需要在LINQ中进行外部连接时,很难找到。我不明白他们为什么这么叫它

    尽管在VB.Net中,这里有一篇文章介绍了转换为LINQ语法的各种SQL构造,即使在VB中,也很容易转换为扩展方法:

    编辑:@DavidB在他的评论中发布了一个更好的解决方案,但前提是你可以使用一些ORM导航属性。如果你没有这些属性,那么GroupJoin可能是最合理的
    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
     });
    
    在DB中加入索赔。索赔人索赔。索赔ID等于索赔。索赔ID) .DefaultIfEmpty() 在DB中加入用户。声明中的用户。用户ID等于用户。用户ID
    哪里(claiments.TrialDate.Value>=dtDayStart&claiments.TrialDate确实
    claimer
    有导航属性
    Claim
    ?并且
    Claim
    有导航属性
    Users
    ?之所以选择名称
    GroupJoin
    ,是因为它实际上是连接和分组的混合体:左边的实体是键,每一个都是定义一组正确的实体(包含0-n项)。当linq提供程序由SQL引擎支持时,它恰好变成外部联接,但在linq to objects中,“GroupJoin”实际上是对其功能的最佳描述。
    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
     });