嗨,我对linq到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
});
我试着使用如下的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
});
如果有人能为我指明正确的方向,告诉我如何正确使用这些连接,并解释它是如何工作的,我将不胜感激。事先非常感谢。
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可能是最合理的