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.Nullable
1[System.Double] GetTotalSeconds(System.Nullable
1 [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, и вы сможете выполнить желаемую операцию.