左LINQ到SQL C#在多对多表上联接
嗨,我是linq to sql的新手,我知道一些基础知识。问题是我想在查询中进行左连接。查询中有3个表左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
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
});