SQL Server для LINQ: несколько соединений и получить последние дубликаты - PullRequest
0 голосов
/ 01 февраля 2019

Я могу получить нужные результаты в SQL Server, но я бы хотел сделать это в LINQ.

Вот рабочий SQL:

declare @interim table (PushContent varchar(max), 
                        OrderNumber varchar(50), 
                        TimeProcessed DateTime)

INSERT INTO @interim (PushContent, OrderNumber, TimeProcessed)
SELECT 
Q.PushContent, TS.varOrderNumber, Q.TimeProcessed
    FROM dbo.PushQueueEntry Q 
        INNER JOIN dbo.Transactions T ON 
                T.intTransactionID = Q.TransactionID
        INNER JOIN dbo.CustomerIntegrationTarget TGT ON 
                TGT.CustomerIntegrationTargetID = Q.CustomerIntegrationTargetID
        INNER JOIN dbo.TransactionServices TS ON 
                TS.intTransactionID = Q.TransactionID
WHERE
        Q.TimeProcessed >= '2019-01-26 00:00:00' 
    AND Q.TimeProcessed <= '2019-01-26 23:59:59'
    AND TGT.CustomerIntegrationDetailID = 63    
    AND Q.QueueStatus = 4
    AND TGT.ContentType = 25
    AND T.intCreatedByUserID IN(
        SELECT
            MAP.UserID
        FROM dbo.CustomerIntegrationServicerMapping MAP
        WHERE
            MAP.CustomerIntegrationDetailID = 63 AND 
            MAP.ServicerCode = 'SLS') --Limit to SLS orders only
group by TS.varOrderNumber, Q.PushContent, Q.TimeProcessed

--select * from @interim

select  P.PushContent
from (select    PushContent, OrderNumber, TimeProcessed,
                ROW_NUMBER() over(partition by OrderNumber 
                        order by TimeProcessed desc) as rn
        from    @interim
    ) as P
where P.rn = 1

Вот текущий LINQ:

List<int> cisMapUserIDs = _context.CustomerIntegrationServicerMappings
    .Where(u => u.CustomerIntegrationDetailID == 63
                && u.ServicerCode == "SLS")
    .Select(u => u.UserID)
    .ToList();

List<int> transIDs = _context.Transactions
    .Where(t => cisMapUserIDs.Contains(t.CreatedByUserID))
    .Select(t => t.TransactionID)
    .ToList();

List<PushQueueEntry> pushQueueEntries = _context.PushQueueEntries
    .Where(x => x.CustomerIntegrationTarget.CustomerIntegrationDetailID == 63
                && x.QueueStatus == QueueStatus.Complete
                && x.CustomerIntegrationTarget.CustomerIntegrationTargetID == 401
                && x.TimeProcessed >= lowerTimeBoundary
                && x.TimeProcessed <= upperTimeBoundary
                && transIDs.Contains(x.TransactionID))
    .ToList();

Мне нужно добавить еще одно объединение на стороне LINQ, чтобы оно соответствовало соединению на стороне SQL, что позволяет мне получить varOrderNumber из TransactionServices, а затем мне нужно сгруппироватьи сделать заказ таким образом, чтобы я мог взять последнюю строку на основе TimeProcessed из таблицы PushQueueEntry.Я читал сообщения о присоединении в LINQ, но когда я пытаюсь это сделать, я получаю сообщение об ошибке, что символ объединения не может быть разрешен.Я также пытался использовать только предложение where, но безуспешно.

SQL возвращает одно поле, которое мне в основном интересно, но в коде бывают случаи, когда другие столбцы необходимы дляобработка.

Возможно, это пример, в котором LINQ не реализовал функцию SQL, но, скорее всего, я просто не знаю синтаксис для выполнения того, чего я хочу достичь.

Заранее спасибо

...