gpt4 book ai didi

c# - 在与 linq-to-entities 的一对多连接中仅获取一条(最后一条)记录

转载 作者:太空狗 更新时间:2023-10-29 22:28:03 24 4
gpt4 key购买 nike

我在 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();

我想更改此查询,以便对于每个 SAP_Master_Project 仅获取具有最新 update_dt 的 SAP_Master_ProjectPartners 记录。我该怎么做?

编辑

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

SAP_MASTER_PROJECT

项目编号

开始

完成

SAP_MASTER_PROJECTPARTNERS

合作伙伴编号

项目编号

合作伙伴名称

城市

地区

更新日期

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

我确信有不止一种方法可以做到这一点,但他的 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

编辑#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

最佳答案

如果您定义了 SAP_Master_ProjectsSAP_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()
;

关于c# - 在与 linq-to-entities 的一对多连接中仅获取一条(最后一条)记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com