簡體   English   中英

在linq-to-entities的一對多連接中只獲得一條(最后一條)記錄

[英]Get only one (last) record in one-to-many join with linq-to-entities

我在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

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

編輯#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()
    ;

聽起來你正試圖提出以下查詢:

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,但這是我最好的嘗試:

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甚至可能都沒有編譯,但希望它會向你發送正確的方向。

對不起,我不會說你的語言。 但是,例如,在MySql中你可以sort by update_dt DESC LIMIT 1添加sort by update_dt DESC LIMIT 1你可以這樣做或者某些類似嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM