C# 具有多个连接且每个连接中都有条件的Linq表达式
我有许多表格,如:C# 具有多个连接且每个连接中都有条件的Linq表达式,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,我有许多表格,如: 用户 用户教育 经历 下面是数据库图 我需要的是用户信息 来自用户的基本信息 他们最后的教育(即他们获得的最新学位) 他们当前正在工作的位置(如果用户没有工作),Experience_cs中的字段将为空 我现在可以做下面的操作,但是我遇到了麻烦1)如何在LAMDA表达式中间进行(ISWORK==TRUE),然后加入到下一个表中。下面是我的表达 List<Models.UserInfo> v = context.User_cs .Joi
List<Models.UserInfo> v = context.User_cs
.Join(context.UserEducation_cs, u => u.UserName, ue => ue.UserName, (u, ue) => new UserEducation_cs
{
UserName = ue.UserName,
EducationId = ue.EducationId,
StartDate = ue.StartDate,
EndDate = ue.EndDate
}).
Join(context.Education_cs, ue => ue.EducationId, e => e.EducationId, (ue, e) => new
{
UserName = ue.UserName,
EducationId = ue.EducationId,
StartDate = ue.StartDate,
EndDate = ue.EndDate,
Title = e.Title,
Major = e.Major,
MajorDetails = e.MajorDetails,
Info = e.Info
}).
Join(context.Experiences, lst => lst.UserName, ex => ex.UserName, (lst, ex) => new Models.UserInfo
{
UserName = ex.UserName,
EducationId = lst.EducationId,
StartDate = lst.StartDate,
EndDate = lst.EndDate,
Title = lst.Title,
Major = lst.Major,
MajorDetails = lst.MajorDetails,
Info = lst.Info,
IsWorking = ex.IsWorking,
StartDate_ex=ex.StartedDate,
}).
Where(iw => iw.IsWorking == true).ToList();
List v=context.User\u cs
.Join(context.UserEducation\u cs,u=>u.UserName,ue=>ue.UserName,(u,ue)=>newusereducation\u cs
{
UserName=ue.UserName,
EducationId=ue.EducationId,
StartDate=ue.StartDate,
EndDate=ue.EndDate
}).
加入(context.Education\u cs,ue=>ue.EducationId,e=>e.EducationId,(ue,e)=>new
{
UserName=ue.UserName,
EducationId=ue.EducationId,
StartDate=ue.StartDate,
EndDate=ue.EndDate,
Title=e.Title,
主修,
主要细节=主要细节,
Info=e.Info
}).
加入(context.Experiences,lst=>lst.UserName,ex=>ex.UserName,(lst,ex)=>newmodels.UserInfo
{
UserName=ex.UserName,
EducationId=lst.EducationId,
StartDate=lst.StartDate,
EndDate=lst.EndDate,
标题=第一个标题,
少校=第一少校,
主要细节=lst.MajorDetails,
Info=lst.Info,
IsWorking=ex.IsWorking,
开始日期=开始日期,
}).
其中(iw=>iw.IsWorking==true).ToList();
任何帮助都将不胜感激我不确定是否完全理解您的问题。我认为在对列表应用(内部)联接之前,需要对列表进行筛选。要仅获取每个
用户的最新教育\u cs
条目,我想您可以使用分组。另外,我还没有完全测试过这段代码:
List<Models.UserInfo> v = context.User_cs
.Join(context.UserEducation_cs, u => u.UserName, ue => ue.UserName, (u, ue) => new UserEducation_cs
{
UserName = ue.UserName,
EducationId = ue.EducationId,
StartDate = ue.StartDate,
EndDate = ue.EndDate
}).
Join(context.Education_cs.GroupBy(q => q.UserName).Select(q => q.OrderByDescending(w => w.StartDate).First()),
ue => ue.EducationId, e => e.EducationId, (ue, e) => new
{
UserName = ue.UserName,
EducationId = ue.EducationId,
StartDate = ue.StartDate,
EndDate = ue.EndDate,
Title = e.Title,
Major = e.Major,
MajorDetails = e.MajorDetails,
Info = e.Info
}).
Join(context.Experiences.Where(ex => ex.IsWorking), lst => lst.UserName, ex => ex.UserName, (lst, ex) => new Models.UserInfo
{
UserName = ex.UserName,
EducationId = lst.EducationId,
StartDate = lst.StartDate,
EndDate = lst.EndDate,
Title = lst.Title,
Major = lst.Major,
MajorDetails = lst.MajorDetails,
Info = lst.Info,
IsWorking = ex.IsWorking,
StartDate_ex=ex.StartedDate,
}).ToList();
List v=context.User\u cs
.Join(context.UserEducation\u cs,u=>u.UserName,ue=>ue.UserName,(u,ue)=>newusereducation\u cs
{
UserName=ue.UserName,
EducationId=ue.EducationId,
StartDate=ue.StartDate,
EndDate=ue.EndDate
}).
Join(context.Education\u cs.GroupBy(q=>q.UserName)。选择(q=>q.OrderByDescending(w=>w.StartDate)。First()),
ue=>ue.EducationId,e=>e.EducationId,(ue,e)=>new
{
UserName=ue.UserName,
EducationId=ue.EducationId,
StartDate=ue.StartDate,
EndDate=ue.EndDate,
Title=e.Title,
主修,
主要细节=主要细节,
Info=e.Info
}).
加入(context.Experiences.Where(ex=>ex.IsWorking),lst=>lst.UserName,ex=>ex.UserName,(lst,ex)=>newmodels.UserInfo
{
UserName=ex.UserName,
EducationId=lst.EducationId,
StartDate=lst.StartDate,
EndDate=lst.EndDate,
标题=第一个标题,
少校=第一少校,
主要细节=lst.MajorDetails,
Info=lst.Info,
IsWorking=ex.IsWorking,
开始日期=开始日期,
}).ToList();
您当前的表达式到底出了什么问题?它现在正在执行join,但我想检查的条件是1)在经验中工作,应该是真的2)在教育中,join中只应包含最新的LastDate行我想您必须使用.GroupJoin()
。在这种情况下,右侧不是单个元素,而是所有匹配元素的IEnumerable。然后,您可以在该序列上应用进一步的条件或过滤器,以获取所需的元素(例如,一个、多个或无)。您理解得对,我还希望仅从用户当前所在的位置选择“体验”中的行working@Alex,这不是正在工作的功能吗?如果没有,您如何确定?出于某种原因,UserName=ue.FirstOrDefault().UserName…,正在工作。你忘了包括FirstOrDefault()?@Alex,你的意思是在第二个Join
中你得到了一个集合First
afterOrderByDescending
应该将组扁平化为单个(最新)元素,但可能我遗漏了什么。另外,我刚才注意到,您可以在第一个Join
中应用相同的分组和选择,而不是在第二个Join
中应用相同的分组和选择(就像现在一样,第一个Join
不起任何作用)。