2

嗨,我对 linq to 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
                 });

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

4

3 回答 3

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

左外连接

于 2013-02-09T13:55:53.933 回答
0

在 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 可能是最合理的

于 2013-02-09T13:40:21.453 回答
0

你一定认识一个栾。如果您希望所有 Claiments 返回,首先从 Claiments 中选择,然后左连接到其他表。

尝试以下操作:

LINQ to SQL 左外连接

于 2013-02-09T13:25:07.073 回答