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

本文关键字:LINQ TO SQL LEFT | 更新日期: 2023-09-27 17:58:23

嗨,我对linq到sql有点陌生,我知道一些基础知识。问题是我想在查询中执行左联接。查询中有3个表。

  1. 索赔人(应从此表返回所有行)
  2. 索赔
  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
                 });

我试着使用如下的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
                 });

如果有人能为我指明正确的方向,告诉我如何正确使用这些连接,并解释它是如何工作的,我将不胜感激。事先非常感谢。

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

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
 });

左外加入

你一定知道一个Luan。如果您希望所有索赔都返回,请从索赔中进行选择,然后左键联接到其他表。

尝试以下操作:

LINQ到SQL左外联接

在LINQ中,".Join()"扩展方法等效于SQL内部联接。

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

假设您熟悉.Join,那么GroupJoin就很容易使用。我不得不承认,当我第一次需要在LINQ中进行外部联接时,很难找到。我不明白他们为什么这样称呼它。

尽管在VB.Net中,这里有一篇文章介绍了各种SQL构造,这些构造被翻译成LINQ语法,即使在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可能是最合理的