Я пытаюсь динамически выбирать столбец таблицы на основе дня недели указанной даты.Я видел сообщения о динамическом выборе столбца, но не увенчался успехом.
В моей таблице есть столбец для каждого дня недели, и в этом столбце может быть либо значение 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