[英]INNER Join and LEFT OUTER JOIN in EF-Core with Linq
我正在尝试将下面的SQL转换为c#(.net core 2.1和EF core 2.2)中的Linq查询
SELECT TD.*, RD.Match
FROM TransactionDetail TD
INNER JOIN dbo.Measure M ON M.InternalID = TD.MetricCode
LEFT OUTER JOIN (
SELECT tmp.ID, tmp.ReportingDate, 1 AS Match
FROM tmp
) AS RD ON RD.ID = M.Frequency AND RD.ReportingDate = TD.ReportingDate
WHERE RD.Match IS NULL AND
TD.BatchID = @batchID AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'NRD') AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'RDP') AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'RDF')
有人可以帮我如何先进行内联接,然后再进行左联接吗?
我到现在为止
var IQ1 = (from TD in IngestionHubContext.TransactionDetail
join M in ModelHospitalPreviewContext.Measure on TD.MetricCode equals M.InternalId
join R in RD.DefaultIfEmpty on new {ID = M.Frequency, TD.ReportingDate} equals new { R.ID, R.ReportingDate} into J
//?????
任何帮助或建议,表示赞赏。
提前致谢。
在下面,您可以使用单个DbContext
查找示例的简化版本:
var batchId = 123;
var transactionDetailFailureReasonsToExcludeQuery =
from r in dbContext.TransactionDetailFailureReasons
where
r.TransactionFailureReasonID == "NRD" ||
r.TransactionFailureReasonID == "RDP" ||
r.TransactionFailureReasonID == "RDF"
select r.TransactionDetailID;
var query =
from td in dbContext.TransactionDetail
join m in dbContext.Measure on td.MetricCode equals m.InternalID
join rd in dbContext.Tmp on new { m.Frequency, td.ReportingDate } equals new { Frequency = rd.ID, rd.ReportingDate } into rdItems
from rd in rdItems.DefaultIfEmpty()
where
rd == null &&
td.BatchID == batchId &&
transactionDetailFailureReasonsToExcludeQuery.Contains(td.ID) == false
select td;
现在,您需要对其进行更新,以对实体使用正确的DbContext
。
希望这可以帮助。
在Ef Core中,您可以使用SQL查询,而不必将其更改为Linq查询。 目前,Ef Core不支持将所有Linq操作转换为SQL。 因此,将SQL转换为Linq可能会导致客户端评估 。
您可以在此处找到详细信息: Raw SQL
请使用模型值更改“选择”查询。
var transactionDetails = IngestionHubContext.TransactionDetail.FromSql("SELECT TD.*, RD.Match
FROM TransactionDetail TD
INNER JOIN dbo.Measure M ON M.InternalID = TD.MetricCode
LEFT OUTER JOIN (
SELECT tmp.ID, tmp.ReportingDate, 1 AS Match
FROM tmp
) AS RD ON RD.ID = M.Frequency AND RD.ReportingDate = TD.ReportingDate
WHERE RD.Match IS NULL AND
TD.BatchID = @batchID AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'NRD') AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'RDP') AND
NOT EXISTS (SELECT TransactionFailureReasonID FROM TransactionDetailFailureReasons R WHERE R.TransactionDetailID = TD.ID and R.TransactionFailureReasonID = 'RDF')", batchIDParameter);
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.