在linq-to-entities的一对多连接中只获得一条(最后一条)记录

Rem*_*rME 5 c# linq linq-to-entities join one-to-many

我在linq-to-entities中有以下内容

clientprojects = (from p in this.SAPMappingEntities.SAP_Master_Projects 
join c in this.SAPMappingEntities.SAP_Master_ProjectPartners on c.project_no equals p.project_no
where c.partner_name.Contains(clientstring)
orderby p.start descending 
select new ClientProjects { client = c.partner_name, location = c.city +", "+c.region, project_no = c.project_no, start_dt = p.start, end_dt = p.finish }).Take(50).ToList();
Run Code Online (Sandbox Code Playgroud)

我想更改此查询,以便每个SAP_Master_Project只获取具有最新update_dt的SAP_Master_ProjectPartners记录.我怎样才能做到这一点?

编辑

有一个项目表,其中包含项目编号和项目详细信息,包括项目开始和结束日期.有一个项目合作伙伴表,其中包含项目合作伙伴编号,名称,项目编号,更新日期和其他详细信息.

SAP_MASTER_PROJECT

project_no

开始

完

SAP_MASTER_PROJECTPARTNERS

partner_no

project_no

PARTNER_NAME

市

区域

update_dt

当用户在文本框中输入"ABC"时,我想要返回的信息是项目编号,项目开始日期,项目结束日期加上项目合作伙伴名称,城市和最近50个项目的最后一个项目合作伙伴记录的状态(基于开始日期)项目合作伙伴名称包含或类似"ABC".

我确信有多种方法可以做到这一点,但他的SQL给了我需要的结果:

SELECT TOP 50 p.project_no, p.start, p.finish, c.partner_name, c.city, c.region
FROM 
(select pp.project_no, pp.partner_name, pp.city, pp.region
from SAP_Master_ProjectPartners pp
where pp.partner_name LIKE @clientstring AND pp.update_dt = (select max(pp1.update_dt)
                       from SAP_Master_ProjectPartners pp1
                       where pp1.project_no = pp.project_no)) c
join SAP_Master_Projects p
on (p.project_no = c.project_no)
ORDER BY p.start DESC
Run Code Online (Sandbox Code Playgroud)

编辑#2 sql实际上返回了一些具有相同update_dt的项目,所以我将sql修改为如下.仍在努力转换为linq.

SELECT TOP 50 p.project_no, p.start, p.finish, c.partner_name, c.city, c.region, c.update_dt, c.row_id
FROM SAP_Master_Projects p
join
(select pp.project_no, pp.partner_name, pp.city, pp.region, pp.update_dt, pp.row_id
from SAP_Master_ProjectPartners pp
where pp.partner_name LIKE @clientstring AND pp.row_id = (select TOP 1 row_id
                       from SAP_Master_ProjectPartners pp1
                       where pp1.project_no = pp.project_no order by update_dt DESC)) c
on (p.project_no = c.project_no) where p.active_flag = 1
ORDER BY p.start DESC
Run Code Online (Sandbox Code Playgroud)

Mer*_*ham 9

如果您在两者之间定义实体关系,则此查询可能会更简单SAP_Master_Projects,SAP_Master_ProjectPartners因此连接可以是隐式而非显式.

编辑因为你不能这样做,这样的事情可能会起作用(let在where子句中使用和进行逻辑连接):

var clientProjects =
    (
        from p in entities.SAP_Master_Projects
        let c = entities.SAP_Master_ProjectPartners
            .Where(cl => cl.partner_name.Contains(clientstring)
                && cl.project_no == p.project_no
                )
            .OrderBy(cl => cl.update_dt) // Todo: Might need to be descending?
            .FirstOrDefault()
        where c != null
        orderby p.start descending
        select new ClientProjects
        {
            client = c.partner_name,
            location = c.city + ", " + c.region,
            project_no = c.project_no,
            start_dt = p.start,
            end_dt = p.finish
        }
        )
    .Take(50)
    .ToList()
    ;
Run Code Online (Sandbox Code Playgroud)