C# 具有条件的多个联接:LINQ查询

C# 具有条件的多个联接:LINQ查询,c#,sql,.net,linq,lambda,C#,Sql,.net,Linq,Lambda,我正在尝试将SQL查询转换为c等价的LINQ/Lambda,如下所示 SELECT mv.MeasureID, mv.ProviderID, MAX(mv.ReportingDate) AS mostRecentReportingDate FROM (((TransactionDetail AS td INNER JOIN #provider AS p ON td.TrustCode = p.Code) INNER JOIN #measure

我正在尝试将SQL查询转换为c等价的LINQ/Lambda,如下所示

SELECT  mv.MeasureID, mv.ProviderID, MAX(mv.ReportingDate) AS mostRecentReportingDate
FROM    (((TransactionDetail AS td
           INNER JOIN #provider AS p ON td.TrustCode = p.Code)
           INNER JOIN #measure AS m ON td.MetricCode = m.InternalID)
           INNER JOIN #measureValue AS mv ON m.ID = mv.MeasureID AND p.ID = mv.ProviderID)
WHERE   td.BatchID = @batchID AND
        td.RowAction = 'A' AND
        (m.Type = 7 OR m.Type = 8) AND
        td.Value <> mv.Value
GROUP BY mv.MeasureID, mv.ProviderID
join MV in measureValue on new { mID = M.Id, pID = P.Id } equals new {mID = MV.MeasureId, pID = MV.ProviderId }
以下是我迄今为止所做的尝试

 var total = (from TD in ingestionHubContext.TransactionDetail
                    join P in provider on TD.TrustCode equals P.Code
                    join M in measure on TD.MetricCode equals M.InternalId
                    join MV in measureValue on M.Id equals MV.MeasureId //and logic to be fixed
                    where TD.BatchId == batchId && TD.RowAction == "A"
                    && (M.Type == 7 || M.Type == 8) && TD.Value != MV.Value
                    group TD by new { MV.MeasureId, MV.ProviderId } into Total
                    select Total);
你能建议我怎样才能写得更好吗?并处理代码第4行中的连接和条件

我试过下面的方法,但不起作用,因为它们需要在 身份证

我还需要帮助做MAXmv.ReportingDate


非常感谢您的帮助。提前感谢。

当ON子句中有多个字段时,您需要使用对象进行比较。 您的LINQ查询应编写如下:

    var total = (from TD in ingestionHubContext.TransactionDetail
                        join P in provider on TD.TrustCode equals P.Code
                        join M in measure on TD.MetricCode equals M.InternalId
// Here is how
                        join MV in measureValue on new {M.Id, P.Id} equals new {MV.MeasureId, MV.ProviderId}
// the rest is your original where statement
                        where TD.BatchId == batchId && TD.RowAction == "A"
                        && (M.Type == 7 || M.Type == 8) && TD.Value != MV.Value
                        group TD by new { MV.MeasureId, MV.ProviderId } into Total
                        select Total);

我通过编写下面的查询来解决这个问题

SELECT  mv.MeasureID, mv.ProviderID, MAX(mv.ReportingDate) AS mostRecentReportingDate
FROM    (((TransactionDetail AS td
           INNER JOIN #provider AS p ON td.TrustCode = p.Code)
           INNER JOIN #measure AS m ON td.MetricCode = m.InternalID)
           INNER JOIN #measureValue AS mv ON m.ID = mv.MeasureID AND p.ID = mv.ProviderID)
WHERE   td.BatchID = @batchID AND
        td.RowAction = 'A' AND
        (m.Type = 7 OR m.Type = 8) AND
        td.Value <> mv.Value
GROUP BY mv.MeasureID, mv.ProviderID
join MV in measureValue on new { mID = M.Id, pID = P.Id } equals new {mID = MV.MeasureId, pID = MV.ProviderId }
这允许使用多个表列的条件

如果有人能帮我更有效地重写,我将不胜感激


谢谢。

对不起,我没有看到你的第二个问题。 最终的LINQ查询(包括Max)将实现您想要的功能,如下所示:

var query = from td in transactionDetails
                        join p in providers on td.TrustCode equals p.Code
                        join m in measures on td.MetricCode equals m.InternalId
                        join mv in measureValues on new { mId = m.Id, pId = p.Id } equals new { mId = mv.MeasureId, pId = mv.ProviderId }
                        where td.BatchId == batchId && td.RowAction == "A"
                        && (m.Type == 7 || m.Type == 8) && td.Value != mv.Value
                        select new { td, p, m, mv } into queryList
                        group queryList by new { queryList.mv.MeasureId, queryList.mv.ProviderId } into groupedList
                        select new {
                            groupedList.Key.MeasureId,
                            groupedList.Key.ProviderId,
                            mostRecentReportingDate = groupedList.Max(g => g.mv.ReportingDate) };
我对提供者、度量值等集合使用了简化名称,您可以将真正的提供者放在那里

此LINQ查询将返回原始SQL查询的结果,并将尽可能由SQL Server进行优化,对于LINQ to DB的优化,您可以做的不多


祝你好运

这会出现错误,提示“匿名类型不能有多个同名属性”p.Id。这正是我被困的地方。你能详细说明你的答案吗?你得到这个答案是因为anon试图为P.Id值命名属性Id,但它已经存在于M.Id中。如果M的Id字段名是mId,而P的Id字段名是pId,这就可以了,但是因为两个表中的列共享相同的名称,所以anon无法处理歧义。这就是为什么你为自己发布的新的{mId=M.Id,pId=P.Id}的答案是有效的。关于如何选择MAXmv.ReportingDate的任何建议??谢谢Josh,因为我是从VS开始回复的,我错过了两个属性的名称相同:PUBG,当然,请参阅我的单独答案谢谢你的上述详细解释。