Я хочу получить счетчик для статуса в течение следующих 10 дней в одном удалении базы данных, используя linq в C#. например:Получить отчеты за следующие 10 дней в одной базе данных
Table : Task
Coulmun: Id Status DueDate
Value 1 New Jan 1 2013
Value 2 New Jan 3 2013
Value 3 In Progress Jan 1 2014
Value 4 Completed Jun 21 2016
Теперь я хочу, чтобы принести отчет в течение следующих 10 дней с сегодняшнего дня с указанием: Нет записи, которые находятся в каждом состоянии. Записи, отсчитанные до сегодняшнего дня, должны быть частью сегодняшней даты и с завтрашней даты, когда он должен рассчитывать на этот конкретный день.
Как я могу достичь этого в одном попадании базы данных. Я не хочу снова запрашивать DB снова n снова 10 раз.
Ожидаемый результат:
Date Jun 20 Jun 21 Jun22 Jun 23 Jun24 Jun 25......
New 2 0 0 0 0 0
InPrg 1 0 0 0 0 0
Complt 0 1 0 0 0 0
Решение Пробовал:
SQL запросов:
SELECT count (TaskId) , StatusCode, DueDate from Task
where dateadd(day, datediff(day, 0, DueDate), 0) BETWEEN CAST('2013/06/08' as DATE) and cast('2013/06/18' as DATE)
--where CONVERT(DATETIME, DueDate) >CONVERT(DATETIME, '2013/06/08') and CONVERT(DATETIME, DueDate) < CONVERT(DATETIME, '2013/06/18')
GROUP by StatusCode, DueDate
order by 1 desc
Result :
(No column name) StatusCode DueDate
1 IP 2013-06-08 08:13:36.080
1 IP 2013-06-08 09:49:04.263
1 IP 2013-06-08 10:03:26.550
1 NW 2013-06-08 10:14:11.247
1 IP 2013-06-08 10:33:45.760
1 IP 2013-06-08 20:44:27.427
1 NW 2013-06-09 01:13:54.150
Linq Пробовал:
DateTime startdate;
DateTime.TryParse("2013/06/08", out startdate);
DateTime enddate;
DateTime.TryParse("2013/06/18", out enddate);
var query = repository.Data
.Where(x => x.StatusCode != null
&& EntityFunctions.TruncateTime(x.DueDate) < EntityFunctions.TruncateTime(startdate))
.GroupBy(p => new
{
p.StatusCode
})
.Select(g => new
{
g.Key.StatusCode,
AvailableCpunt = g.Count()
}).ToList();
var result1 = repository.Data
.Where(x => x.StatusCode != null
&& EntityFunctions.TruncateTime(x.DueDate) > EntityFunctions.TruncateTime(startdate)
&& EntityFunctions.TruncateTime(x.DueDate) < EntityFunctions.TruncateTime(enddate))
.GroupBy(p => new
{
p.StatusCode,
p.DueDate
})
.Select(g => new
{
StatusCode = g.Key.StatusCode,
DueDate = g.Key.DueDate,
AvailableCount = g.Count()
}).ToList();
Но опять-таки сравнить со временем также и курица Результаты не верны. Может ли кто-нибудь помочь?
Добро пожаловать на Stack Overflow. Когда вы отправляете сообщения, пожалуйста, используйте предварительный просмотр, чтобы проверить, что ваш пост доступен для чтения, прежде чем вы опубликуете - перед редактированием таблицы в вашем вопросе были непонятными. –
Теперь, что вы пробовали? И каков тип 'DueDate'? Похоже, вы могли бы просто использовать два запроса: один для «все в прошлом», группировку по статусу и учетные записи, а также «все между сегодняшним и 10-дневным временем», группировку по статусу, дате и учетным записям. Выполнение этого в одном запросе более сложное, но оно должно быть выполнимо, если вы можете в принципе сказать: «Если срок истекает до сегодняшнего дня, притворись, что он сегодня». Это похоже на вопрос SQL на самом деле - в особенности LINQ. –
Я попытался использовать группу в статусе, чтобы получить результат для прошлых дат. Так он работал, и вы по праву отметили, что можем сделать для второй части, группируя статус и дату, но когда я пытаюсь выполнить ее сравнение временная часть также как duedate является столбцом datetime. DueDate - столбец DateTime. Я попытался использовать CONVERT (DATETIME, DueDate), CAST ('2013/06/08' как DATE), dateadd (день, датированный (день, 0, DueDate), 0), но не из них работают, все сравниваются время также и, следовательно, я получаю так много записей. Не могли бы вы предоставить некоторый фрагмент, для sql и linq, если это возможно в 1 запросе –