Несколько соединений с условиями между ними: запрос LINQ - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь преобразовать 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

Я застрял в этой строке

INNER JOIN #measureValue AS mv ON m.ID = mv.MeasureID AND p.ID = 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-й строке моего кода.

Я попробовал ниже, что не работает, так как они должны соответствовать (ошибки в P.Id)

join MV in measureValue 
on new { M.id, P.Id } equals new { MV.MeasureId, MV.ProviderId }

Мне также нужна помощь в выполнении MAX(mv.ReportingDate)

. Любая помощь очень ценится.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Я решил, написав запрос, подобный приведенному ниже*

Спасибо.

0 голосов
/ 24 февраля 2019

Извините, я не увидел ваш второй вопрос.В последнем запросе 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 ...

Удачи!

0 голосов
/ 22 февраля 2019

Если в предложении 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...