Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个连接且每个连接中都有条件的Linq表达式_C#_.net_Entity Framework_Linq - Fatal编程技术网

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

我有许多表格,如:

  • 用户
  • 用户教育
  • 经历
  • 下面是数据库图

    我需要的是用户信息

  • 来自用户的基本信息
  • 他们最后的教育(即他们获得的最新学位)
  • 他们当前正在工作的位置(如果用户没有工作),Experience_cs中的字段将为空
  • <>我现在可以做下面的操作,但是我遇到了麻烦1)如何在LAMDA表达式中间进行(ISWORK==TRUE),然后加入到下一个表中。下面是我的表达

       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
    after
    OrderByDescending
    应该将组扁平化为单个(最新)元素,但可能我遗漏了什么。另外,我刚才注意到,您可以在第一个
    Join
    中应用相同的分组和选择,而不是在第二个
    Join
    中应用相同的分组和选择(就像现在一样,第一个
    Join
    不起任何作用)。