Entity Framework 6 SqlFunctions DateDiff не реализован в пакете nuget

Я просто загрузил пакеты nuget для фреймворка сущности 6 (EntityFramework.dll Version 6.0.0.0 Runtime Version v4.0.30319 и EntityFramework.SqlServer Version 6.0.0.0 Runtime Version v4.0.30319) в мое решение 4.5 Framework (оно находится в нескольких проектах)

В одном из проектов я ссылался и пытался реализовать DateDiff Sql

RepositoryFactory.CreateReadOnly<*******>()
 .Where(at => at.AccessedDate.HasValue 
 && at.CreatedDate >= startDate && at.CreatedDate <= endDate
 && System.Data.Entity.SqlServer.SqlFunctions.DateDiff("ss", at.CreatedDate, at.AccessedDate.Value) > 0)
 .GroupBy(at => at.Participant.Id)
 .Select(at => new TimeOnSite
 {
 TimeSpentInSeconds = at.Sum(p => p.AccessedDate.Value.Subtract(p.CreatedDate).TotalSeconds), 
 ParticipantId = at.Key
 }).ToList();
</*******>

К моему удивлению, при запуске кода я получил не поддерживаемое исключение. Когда я посмотрел на источник в System.Data.Entity.SqlServer.SqlFunctions, все функции DateDiff не имели реализации, они только бросали NotSupportedException s. Ниже приведен пример:

/// <summary>
/// Returns the count of the specified datepart boundaries crossed between the specified start date and end date.
/// </summary>
/// 
/// <returns>
/// The number of time intervals between the two dates.
/// </returns>
/// The part of the date to calculate the differing number of time intervals.The first date.The second date.
[SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "datePartArg")]
[SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "endDate")]
[SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "startDate")]
[DbFunction("SqlServer", "DATEDIFF")]
public static int? DateDiff(string datePartArg, DateTime? startDate, DateTime? endDate)
{
 throw new NotSupportedException(Strings.ELinq_DbFunctionDirectCall);
}

Я также попытался использовать System.Data.Linq.SqlClient.SqlMethods.DateDiffSecond который был реализован, но получить следующее исключение:

LINQ to Entities не распознает метод 'Int32 DateDiffSecond (System.DateTime, System.DateTime)', и этот метод не может быть переведен в выражение хранилища.

1 ответ

Я искал не то место. Правильная функция была в System.Data.Entity.SqlServer.SqlFunctions. Правильный запрос оказался

RepositoryFactory.CreateReadOnly<********>()
 .Where(at => at.AccessedDate.HasValue 
 && at.CreatedDate >= startDate && at.CreatedDate <= endDate
 && SqlFunctions.DateDiff("ss", at.CreatedDate, at.AccessedDate.Value) > 0)
 .GroupBy(at => at.Participant.Id)
 .Select(at => new TimeOnSite {
 TimeSpentInSeconds = at.Sum(p => 
 SqlFunctions.DateDiff("ss", p.CreatedDate, p.AccessedDate.Value)
 ),
 // p.AccessedDate.Value.Subtract(p.CreatedDate).TotalSeconds), 
 ParticipantId = at.Key
 })
 .ToList();
</********>

licensed under cc by-sa 3.0 with attribution.