简体   繁体   English

在多对多表上向LEFT LINQ TO SQL C#JOIN

[英]LEFT LINQ TO SQL C# JOIN on many to many table

Hi im kinda new to linq to sql I know about the basics. 嗨,我对linq to sql有点陌生,我了解一些基础知识。 The problem is I want to do a left join in a query. 问题是我想在查询中进行左联接。 There are 3 tables in the query. 查询中有3个表。

  1. Claimants ( all rows should be returned from this table) 索赔者(所有行应从该表返回)
  2. Claim 要求
  3. User 用户

The query should return all Users who have Claimants. 该查询应返回所有拥有索赔者的用户。 This is done through the many to many table Claim. 这是通过多对多表Claim来完成的。 But regardless of Users all Claimants should be returned. 但是无论用户如何,都应返回所有索赔人。 Thus the left join on Claimants. 因此,左派加入了索赔人。

I have the following query 我有以下查询

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

I have tried using an into statement as follows but with no luck 我尝试使用如下的in语句,但是没有运气

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

I would appreciate it if someone could point me in the right direction as to how to use these joins left right correctly and explain how the work. 如果有人可以向我指出正确使用这些联接的正确方向并解释其工作原理,我将不胜感激。 Thank you very much in advance. 提前非常感谢您。

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 左外加入

You must know a Luan. 你必须知道栾。 If you want all the Claiments to return start by selecting from Claiments and then left join onto the other tables. 如果要所有索赔人返回,请从索赔人中进行选择,然后将其左联接到其他表上。

Try the following : 尝试以下方法:

LINQ to SQL Left Outer Join LINQ to SQL左外部联接

In LINQ, the ".Join()" extension method is the equivalent of SQL inner join . 在LINQ中,“。Join()”扩展方法等效于SQL 内部join

For outer joins you have to use the ".GroupJoin()" extension method. 对于外部联接 ,必须使用“ .GroupJoin()”扩展方法。

Assuming you know the .Join well, the GroupJoin is simple to use. 假设您非常了解.Join,则GroupJoin易于使用。 I have to admit that when I first needed to do an outer join in LINQ it was damn hard to find out. 我必须承认,当我第一次需要在LINQ中进行外部联接时,很难发现它。 I cannot fanthom why did they call it like that. 我不能幻想他们为什么这么称呼它。

Although in VB.Net, here's an article that presents various SQL constructs translated into LINQ syntax, even if in VB, still easy to convert to extension methods: http://blogs.msdn.com/b/vbteam/archive/2007/12/31/converting-sql-to-linq-part-6-joins-bill-horst.aspx?Redirected=true 尽管在VB.Net中,本文还是提供了翻译成LINQ语法的各种SQL构造的文章,即使在VB中,仍然很容易转换为扩展方法: http : //blogs.msdn.com/b/vbteam/archive/2007/ 31分之12/转换-SQL到LINQ部分-6-加入帐单-horst.aspx?重定向=真

EDIT: @DavidB posted in his comments a much better solution, but only if you can use some ORM navigational properties. 编辑:@DavidB在他的评论中发布了一个更好的解决方案,但前提是您可以使用一些ORM导航属性。 If you don't have them, then GroupJoin is probably the most reasonable 如果没有它们,那么GroupJoin可能是最合理的选择

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM