2014-01-17 2 views
4

У меня есть модель:Как группа по datetime.date в EntityFramework

public class DeviceModel 
{ 
    public DateTime Added { get;set; } 
} 

И я хочу, чтобы выбрать кол-устройств, сгруппированных по дате (Addedне дата и время, но только дата). Моя текущая реализация не является допустимым, так как LINQ не может перевести DateTime.Date в SQL:

var result = (
    from device in DevicesRepository.GetAll() 
    group device by new { Date = device.Added.Date } into g 
    select new 
     { 
      Date = g.Key.Date, 
      Count = g.Count() 
     } 
    ).OrderBy(nda => nda.Date); 

Как изменить этот запрос, чтобы заставить его работать?

ответ

10

Ну, по this MSDN документа, Date свойство поддерживается LINQ к SQL, и я бы предположить, что Entity Framework поддерживает его.

Во всяком случае, попробуйте этот запрос (уведомление, что я использую TruncateTime метод для того, чтобы избежать разрешения даты повторно):

var result = from device in 
       (
        from d in DevicesRepository.GetAll() 
        select new 
        { 
         Device = d, 
         AddedDate = EntityFunctions.TruncateTime(d.Added) 
        } 
       ) 
      orderby device.AddedDate 
      group device by device.AddedDate into g 
      select new 
      { 
       Date = g.Key, 
       Count = g.Count() 
      }; 

Надеется, что это помогает.

+3

Неудача, дата не поддерживается в EF6. Об EntityFunctions этот класс устарел, вместо этого я использовал DbFunctions. Но это решение работает. Благодарю. – alexmac

+1

Для новых читателей новый неличный метод: 'DbFunctions.TruncateTime()' in 'using System.Data.Entity;' –

1

Использование EntityFunctions.TruncateTime

var result = (
from device in DevicesRepository.GetAll() 
group device by new { Date = EntityFunctions.TruncateTime(device.Added)} into g 
select new 
    { 
     Date = g.Key.Date, 
     Count = g.Count() 
    } 
).OrderBy(nda => nda.Date);