TimeOfDay не поддерживается в LINQ to Entities - Найти общее количество секунд в Linq 2 SQL

Когда я делаю следующее:

[EdmFunction("Edm", "TruncateTime")]
public static DateTime? TruncateDateTime(DateTime? inputDate)
{
    return inputDate.HasValue ? inputDate.Value.Date : (DateTime?)null;
}

 [EdmFunction("Edm", "TotalSeconds")]
public static double? GetTotalSeconds(DateTime? inputDate)
{
    return inputDate.HasValue ? inputDate.Value.TimeOfDay.TotalSeconds: (double?)null;
}

var employeeSelection = (from c in MyContext.Employees.Where(c => c.From.HasValue && c.To.TimeOfDay.TotalSeconds != 0)
...
select new Employee

{


 To = c.To != DateTime.MinValue && c.To.TimeOfDay.TotalSeconds != 0 ? TruncateDateTime(c.To).Value :
              c.To != DateTime.MinValue && c.To.TimeOfDay.TotalSeconds == 0 ? c.From.Value.AddMinutes(30) :  DateTime.MinValue

}

Я получаю это:

Дополнительная информация: указанный тип члена TimeOfDay не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей.

И когда я пытаюсь это:

var employeeSelection = (from c in MyContext.Employees.Where(c => c.From.HasValue && GetTotalSeconds(c.To) != 0)
...
select new Employee

{


 To = c.To != DateTime.MinValue && GetTotalSeconds(c.To) != 0 ? TruncateDateTime(c.To).Value :
              c.To != DateTime.MinValue && GetTotalSeconds(c.To) == 0 ? c.From.Value.AddMinutes(30) :  DateTime.MinValue

}

Я получил:

Дополнительная информация: Указанный метод 'System.Nullable1[System.Double] GetTotalSeconds(System.Nullable1 [System.DateTime]) 'для типа'GetDateRangeMethod'нельзя преобразовать в выражение хранилища LINQ to Entities.

Как узнать общее количество секунд в Linq to SQL?

Спасибо

3 ответа

Попробуйте использовать SqlFunctions.DatePart.

например, вместо

var employeeSelection = (from c in MyContext.Employees
          .Where(c => c.From.HasValue && GetTotalSeconds(c.To) != 0)

попробуй что-то вроде

var employeeSelection = (from c in MyContext.Employees
          .Where(c => c.From.HasValue && SqlFunctions.DatePart("second", c.To) != 0)

Для NetMage

var employeeSelection = (from c in MyContext.Employees
          .Where(c => c.From.HasValue && (SqlFunctions.DatePart("second", c.To) + (60 * SqlFunctions.DatePart("minute", c.To)) + (3600 * SqlFunctions.DatePart("hour", c.To))) != 0)

куда

TotalSeconds = (SqlFunctions.DatePart("second", c.To) + (60 * SqlFunctions.DatePart("minute", c.To)) + (3600 * SqlFunctions.DatePart("hour", c.To)))

Посмотрите канонические функции даты и времени для LINQ-to-Entities и, если вы не знаете, как их вызывать, посмотрите, как: вызывать канонические функции

Доступные методы должны быть в состоянии решить проблему, которая возникает у вас в данный момент, когда используемые вами операции не поддерживаются базой данных.

Если у вас есть запрос Linq-To-Entities, вы можете выполнять только те операции, которые могут быть выполнены вашей системой управления базами данных.

Вам нужно будет получить желаемую информацию из вашей БД и создать список из этого запроса, который будет называться Linq-To-Objects, и вы сможете выполнить желаемую операцию.

Другие вопросы по тегам