[英]How to do a Conditional Join in Sql using Linq in C#?
我試圖將Sql查詢傳遞給C#LINQ連接。 我試過但我無法做到這一點。 SQL中的相應查詢按原樣運行:
SELECT pj01.CLID from us20
INNER JOIN pj01 ON pj01.PJID =
(
CASE
WHEN (us20.BKNM = 'PJID')
THEN us20.BKID
WHEN (us20.BKNM = 'PSID')
THEN
(
SELECT PJID FROM pj02 WHERE CLID = us20.CLID AND PSID = us20.BKID
)
END
)
我的Linq嘗試,這不起作用 - 數據不來:
var result =
from us20 in Us20Repository.GetAll()
join pj01 in Pj01Repository.GetAll() on new
{
PJID =
(us20.BKNM == "PJID" ?
us20.BKID :
(
us20.BKNM == "PSID" ?
(
(from pj02 in Pj02Repository.GetAll()
where
pj02.CLID == us20.CLID &&
pj02.PSID == us20.BKID
select new
{
PJID = pj02.PJID
}).First().PJID
) :
""
)
)
} equals new { PJID = pj01.PJID }
select new
{
CLID = pj01.CLID
};
我怎樣才能做到這一點? 這可能嗎?
這是一個示例語法。 希望這會有所幫助
dbContext.SourceTable // source
.Join(dbContext.TargetTable, // target
source=> source.Id, // FK
target=> target.Id, // PK
(source, target) => new { source= source,target=target}).Where(x=>x.source.somefield!=x.target.somefield) // project result
.Select(x => x.source); //the output
默認情況下,匿名類型不支持聰明的Equals
實現,而只是使用Object.Equals
,這就是為什么對我來說查詢沒有返回任何結果是完全有意義的。 如果您的LINQ-Provider無法將查詢轉換為SQL但在本地運行連接,那么這將是完全合理的。 嘗試在連接運算符中省略匿名類型:
var result =
from us20 in Us20Repository.GetAll()
join pj01 in Pj01Repository.GetAll() on
(us20.BKNM == "PJID" ?
us20.BKID :
(
us20.BKNM == "PSID" ?
(
(from pj02 in Pj02Repository.GetAll()
where
pj02.CLID == us20.CLID &&
pj02.PSID == us20.BKID
select new
{
PJID = pj02.PJID
}).First().PJID
) :
""
)
)
equals pj01.PJID
select new
{
CLID = pj01.CLID
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.