[英]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_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()
;
聽起來你正試圖提出以下查詢:
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.