Условие IF ELSE в операторе SELECT запроса LINQ с логикой DATEADD () - PullRequest
0 голосов
/ 28 февраля 2019

ОБНОВЛЕНО: я пытаюсь преобразовать логику SQL ниже в код C #, используя LINQ, и у меня мало путаницы в том, как обрабатывать условия CASE WHEN и ELSE внутри оператора SELECT и функции DATEADD.

WITH tmp AS (
    SELECT  
    ID, 
    StartDate AS ReportingDate, 
    IncrementYears, 
    IncrementMonths,
     IncrementDays,
      DATEADD(YEAR, 1, GETDATE()) AS EndDate
    FROM    TransactionDetailDateFrequency
    UNION ALL
    SELECT  tmp.ID,
            CASE WHEN 
            tmp.IncrementDays > 0 
            THEN DATEADD(YEAR,tmp.IncrementYears,DATEADD(MONTH,tmp.IncrementMonths,DATEADD(DAY,tmp.IncrementDays,tmp.ReportingDate)))
            ELSE 
            EOMONTH(DATEADD(YEAR,tmp.IncrementYears,DATEADD(MONTH,tmp.IncrementMonths,tmp.ReportingDate))) 
            END AS ReportingDate,
            tmp.IncrementYears, 
            tmp.IncrementMonths, 
            tmp.IncrementDays, 
            tmp.EndDate
    FROM    tmp
    WHERE   tmp.ReportingDate < tmp.EndDate) 

    select * from tmp
    OPTION (MAXRECURSION 0)

Iдо сих пор,

var calculatedDate = DateTime.Now.AddYears(1);

        var items = (from TDD in IngestionHubContext.TransactionDetailDateFrequency
                     select new { TDD.Id, ReportingDate = TDD.StartDate, TDD.IncrementYears, TDD.IncrementMonths, TDD.IncrementDays, EndDate = calculatedDate });

        var Temp = items.Concat(from T in items
                                where T.ReportingDate < T.EndDate
                                select new
                                {
                                    T.Id,
                                    ReportingDate = T.IncrementDays > 0 ? T.ReportingDate.Value.AddYears(T.IncrementYears.Value).AddMonths(T.IncrementMonths.Value).AddDays(T.IncrementDays.Value):
                                     T.ReportingDate.Value.AddYears(T.IncrementYears.Value).AddMonths(T.IncrementMonths.Value),
                                    T.IncrementYears,
                                    T.IncrementMonths,
                                    T.IncrementDays,
                                    T.EndDate
                                });

Может кто-нибудь подсказать, как я могу реализовать логику EOMONTH () в c # внутри LINQ

ОБНОВЛЕНО: я добавил выше запрос Linq, но получаюошибка в items.Concat - 'не содержит определения для concat и наилучшей перегрузки метода расширения.1012 * Любая помощь приветствуется.

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

1 Ответ

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

То, что вы хотите сделать, проще понять, как можно выполнить ваш CASE с немного другим форматированием вашего заявления.Все, что вам нужно для этой части, это использовать троичный оператор .Для использования функций DATEADD требуются некоторые встроенные в Entity Framework функции> = 6.0 .

(from TDD in IngestionHubContext.TransactionDetailDateFrequency
select new { 
    TDD.Id, 
    CalculatedDate = TDD.IncrementDays > 0 ?
        DbFunctions.AddYears(
            DbFunctions.AddMonths(
                DbFunctions.AddDays(TDD.ReportingDate, 
                                    TDD.IncrementDays), 
                TDD.IncrementMonths), 
            TDD.IncrementYears) :
        DbFunctions.AddYears(
            DbFunctions.AddMonths(TDD.ReportingDate,
                                  TDD.IncrementMonths),
            TDD.IncrementYears),
    ReportingDate = TDD.StartDate, 
    TDD.IncrementYears, 
    TDD.IncrementMonths, 
    TDD.IncrementDays, 
    EndDate = calculatedDate 
});
...