1

我正在尝试将以下 SQL 转换为 c# 中的 Linq 查询(.net core 2.1 和 EF core 2.2)

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
                   //????? 

任何帮助或建议表示赞赏。

提前致谢。

4

2 回答 2

3

您可以在下面找到示例的简化版本,使用单个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实体的权限。

希望这可以帮助。

于 2019-03-01T15:21:48.310 回答
0

在 Ef Core 中,您可以使用 SQL 查询,而不必将它们更改为 Linq 查询。目前,Ef Core 不支持将所有 Linq 操作转换为 SQL。因此,将 SQL 转换为 Linq 会导致客户端评估

您可以在此处找到详细信息:原始 SQL

请使用您的模型值更改您的 Select 查询。

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);

我希望这有帮助。

于 2019-03-01T15:29:44.947 回答