首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一对多的连接中只获取一条(最后一条)记录与linq到实体连接。

在一对多的连接中只获取一条(最后一条)记录与linq到实体连接。
EN

Stack Overflow用户
提问于 2011-10-27 03:08:25
回答 3查看 9.8K关注 0票数 5

我在linq到实体中有以下内容

代码语言:javascript
复制
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

project_no

开始

完成

SAP_MASTER_PROJECTPARTNERS

partner_no

project_no

partner_name

城市

地域

update_dt

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

我肯定有不止一种方法可以做到这一点,但是他的SQL给了我我需要的结果:

代码语言:javascript
复制
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实际上返回了几个具有相同update_dt的项,因此我将该update_dt修改如下。还在挣扎着要皈依林克。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-27 04:13:11

如果您在SAP_Master_ProjectsSAP_Master_ProjectPartners之间定义了一个实体关系,那么这个查询可能会更简单,因此连接可以是隐式的,而不是显式的。

由于您不能这样做,所以这样的操作可能会工作(使用let并在where子句中执行逻辑连接):

代码语言:javascript
复制
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()
    ;
票数 10
EN

Stack Overflow用户

发布于 2011-10-27 04:09:00

听起来,您正在尝试提出以下查询:

代码语言:javascript
复制
SELECT *
  FROM MasterProjects p
       INNER JOIN (SELECT project_no,
                          partner_name
                     FROM ProjectPartners o
                    WHERE o.update_dt = (SELECT MAX(update_dt)
                                           FROM ProjectPartners i
                                          WHERE i.project_no = o.project_no)) c
               ON p.project_no = c.project_no
              AND p.partner_name = c.partner_name

我不太清楚如何将它翻译成LINQ,但我最好的尝试是:

代码语言:javascript
复制
var clientprojects =
    from p in MasterProjects
    join c in ProjectPartners on p.project_no == c.project_no
   where c.partner_name == (from o in ProjectPartners
                           where o.project_no == c.project_no
                             and o.update_dt == (from i in ProjectParters
                                                where o.project_no = i.project_no
                                               select i.update_dt).Max()
                          select o.partner_name).First();

上面的LINQ甚至可能不会编译,但希望它能让您朝着正确的方向前进。

票数 1
EN

Stack Overflow用户

发布于 2011-10-27 03:12:36

我不会说你的语言抱歉。但是,例如,在MySql中,您可能会添加sort by update_dt DESC LIMIT 1,您能这样做吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7911325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档