Linq Выберите, где конкретный столбец имеет значение - PullRequest
0 голосов
/ 02 января 2019

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

В моей таблице есть столбец для каждого дня недели, и в этом столбце может быть либо значение NULL, либо число (число), а также некоторые другие столбцы, к которым я обращаюсь.

+------+------+------+------+------+------+------+
| Mon  | Tue  | Wed  | Thur | Fri  | Sat  | Sun  |
+------+------+------+------+------+------+------+
| NULL | NULL | NULL | 1867 | NULL | NULL | NULL |
+------+------+------+------+------+------+------+

В моем Linq я передаю определенную дату (17.01.2009, 00:00).Исходя из дня недели для этой даты (в данном случае четверга), мне нужно посмотреть, есть ли значение в столбце [Чт] или оно равно нулю вместе с некоторыми другими условиями WHERE.В конечном итоге ищется количество строк, в которых эти условия выполняются, и в столбце конкретного дня недели есть значение.В SQL я использовал оператор case, но он был уродлив и плохо переводил на Linq.

Ниже приведен мой запрос без необходимого предложения WHERE.В этом примере я ожидаю, что мой запрос вернет значение 1. Если бы дата была 18.01.2009 в 12:00, я бы ожидал, что он вернет 0.

int numOfRecords = biMarketEntities.DistRuleNews
    .Where(x => DMCodeDate.CompanyCode.Contains(x.CompanyCode) &&
    DMCodeDate.DMCode == x.DMCode && 
    DMCodeDate.Date.Date >= x.StartDate && DMCodeDate.Date.Date <= x.EndDate) 
    .Count();

РЕДАКТИРОВАТЬ: Прилагается SQL-запрос, который я пытаюсь перевести на Linq.В моем текущем операторе Linq отсутствует длинная инструкция CASE в моем предложении WHERE, и это дополнительное условие, которое я пытаюсь кратко добавить в мой запрос Linq.

SELECT COUNT(*)
FROM [BIMarket].[dbo].[DISTRULENEW]
WHERE [DISTRULENEW].[companycode] IN ('LVT')
    AND [DISTRULENEW].[dmcode] IN ('LVTTMC')
    AND '1/17/2019 12:00:00 AM' BETWEEN [DISTRULENEW].[startdate]
        AND [DISTRULENEW].[enddate]
    AND CASE Datename([DW], '1/17/2019 12:00:00 AM')
        WHEN 'Monday'
            THEN CASE 
                    WHEN [DISTRULENEW].[mon] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[mon]
                    END
        WHEN 'Tuesday'
            THEN CASE 
                    WHEN [DISTRULENEW].[tue] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[tue]
                    END
        WHEN 'Wednesday'
            THEN CASE 
                    WHEN [DISTRULENEW].[wed] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[wed]
                    END
        WHEN 'Thursday'
            THEN CASE 
                    WHEN [DISTRULENEW].[thu] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[thu]
                    END
        WHEN 'Friday'
            THEN CASE 
                    WHEN [DISTRULENEW].[fri] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[fri]
                    END
        WHEN 'Saturday'
            THEN CASE 
                    WHEN [DISTRULENEW].[sat] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[sat]
                    END
        WHEN 'Sunday'
            THEN CASE 
                    WHEN [DISTRULENEW].[sun] = [DISTRULENEW].[geoid]
                        THEN [DISTRULENEW].[zip]
                    ELSE [DISTRULENEW].[sun]
                    END
        END IS NOT NULL

1 Ответ

0 голосов
/ 03 января 2019

Вы не даете много подробностей, но догадываетесь, что хотите что-то подобное (в вашем коде вы проверяете на NULL - мне не совсем понятно, как это работает, но вы можете увидеть, как «переключаться» на основедень недели здесь.

int numOfRecords = biMarketEntities.DistRuleNews
    .Where(x => DMCodeDate.CompanyCode.Contains(x.CompanyCode) 
             && DMCodeDate.DMCode == x.DMCode 
             && DMCodeDate.Date.Date >= x.StartDate 
             && DMCodeDate.Date.Date <= x.EndDate) 
    .Where(x => {
       var retVal = x.Zip;
       switch (DMCodeDate.Date.DayOfWeek)
       {
          case DayOfWeek.Monday:
            retVal = x.Monday;
            break;
          case DayOfWeek.Tuesday:
            retVal = x.Tuesday;
            break;
          case DayOfWeek.Wednesday:
            retVal = x.Wednesday;
            break;
           // repeat for each day.
       }     

       return retVal; 
    }).Count();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...