Как получить количество дней между двумя датами в asp.net MVC с использованием Linq

#asp.net-mvc

#asp.net-mvc

Вопрос:

Мне нужно получить количество дней между двумя датами из базы данных с помощью запроса Linq, пожалуйста, помогите мне, как это сделать. Спасибо

Я попробовал приведенный ниже код, но он вернул мне результат nul! пожалуйста, помогите

  DateTime rightNow = DateTime.Now;

        //int totalDays = (from d in db.vuExpiredProjectsAssigned
        //                 where d.AssignedTo==obj.DepartmentID
        //                 select (d.AssignedDate - d.DueDate).Days).FirstOrDefault();

        //var numberdays = (from pd in db.vuExpiredProjectsAssigned
        //                  where pd.AssignedTo == obj.DepartmentID
        //                  select SqlFunctions.DateDiff("day", pd.AssignedDate, rightNow));

       var result =(from dd in db.vuExpiredProjectsAssigned
                    where dd.AssignedTo==obj.DepartmentID
                    select new
                    {
                        days=SqlFunctions.DateDiff("Day",dd.DueDate,rightNow)
                    });

       ViewBag.ndays = resu<
  

Комментарии:

1. var days = (DueDate - AssigneDate).Days;

2. ошибка заключается в том, что «Аргументы DbArithmeticExpression должны иметь числовой общий тип».

3. Сначала выполните запрос

4. проверьте мой обновленный код

5. ваша проблема решена?

Ответ №1:

Арифметика с DateTime не поддерживается в Entity Framework. Вы должны использовать DbFunctions *. Итак, для первой части вашего заявления, что-то вроде:

 var numberdays = ( from p in db.vuExpiredProjectsAssigned
                     where p.AssignedTo == obj.DepartmentID
                     select DbFunctions.DiffDays(p.AssignedDate,p.DueDate));
  

или

 var numberdays = ( from p in db.vuExpiredProjectsAssigned
                     where p.AssignedTo == obj.DepartmentID
                     select SqlFunctions.DateDiff("day", p.AssignedDate, p.DueDate));
  

Для получения дополнительной информации, пожалуйста, проверьте ссылки ниже.

Класс SqlFunctions

Класс DbFunctions

Комментарии:

1. он возвращает ошибку » Нет перегрузки для метода ‘diffDays’ принимает 1 аргумент «??

2. что он перенастраивает? я сохраняю результат в ViewBag, он печатает мне сам запрос

3. он должен возвращать массив int. Не могли бы вы, пожалуйста, поставить точку останова и проверить это?

4. ВЫБЕРИТЕ DATEDIFF(день, [Extent1]. [Назначенная дата], [Extent1]. [DueDate]) КАК [C1] ИЗ [dbo] . [vuExpiredProjectsAssigned] КАК [Extent1], ГДЕ [Extent1]. [Назначено] = @p__linq__0

5. не могли бы вы преобразовать свой результат в список

Ответ №2:

попробуйте с этим

 DbFunctions.DiffDays(dd.DueDate,rightNow).Value
  

Обновить

 var rightNow= DateTime.Today.ToShortDateString();

public class democlass
{
 public int count {get; set;}
}
  

и запрос, подобный этому

 var result =(from dd in db.vuExpiredProjectsAssigned
                where dd.AssignedTo==obj.DepartmentID
                select new democlass()
                {
                    count = DbFunctions.DiffDays(dd.DueDate,rightNow).Value
                });
  

затем проверьте свою переменную результата.

Комментарии:

1. var result = (из dd в db.vuExpiredProjectsAssigned где dd. Присваивается == obj. DepartmentID выберите DbFunctions. DiffDays(dd.AssignedDate, dd.DueDate). Значение); ViewBag.ndays = результат;

2. тем не менее, возвращаемый результат равен нулю

3. дни — это анонимное поле?

4. у меня есть дата, хранящаяся в базе данных в коротком формате. пример. 2016-1-1,

5. я сделал, но все равно результат: null

Ответ №3:

Пока вы не используете разницу в днях в where classuse, тогда лучше выполнить это вычисление в вашем коде вместо добавления накладных расходов в SQL, поэтому измените свой код на:

 public class democlass
{
 public DateTime DueDate{get;set;} 
 public int count {get; set;}
}

 var result =((from dd in db.vuExpiredProjectsAssigned
            where dd.AssignedTo==obj.DepartmentID
            select new democlass()
            {
                DueDate= dd.DueDate;
            })).ToList();

result.ForEach(a=> {a.count = a.DueDate.Subtract(DateTime.Now).TotalDays});