У меня была та же проблема, потому что текущий поставщик данных сервера Sql для EF не может перевести DateTime.Parse в CAST (varField As DateTime).
Таким образом, для построения дерева выражений, которое можно успешно преобразовать вВыражение Store, я применил следующее, которое ведет себя так же, как и ожидалось от предиката: DateTime.Parse (x.DateField) == DateConstraint
ПРИМЕЧАНИЕ. Объект «Client» содержит входные параметры для созданияПредикат для использования в: EFQuery.Where (предикат)
if (client.DateOfBirth.HasValue) // can't find a string <-> DateTime conversion syntax with EF support
{
var day = client.DateOfBirth.Value.Day.ToString().PadLeft(2, '0');
var month = client.DateOfBirth.Value.Month.ToString().PadLeft(2, '0');
var year = client.DateOfBirth.Value.Year.ToString();
// very verbose, but apparently there's no EF support for String to DateTime conversion
spec = spec.And(c => SqlFunctions.IsDate(c.DateOfBirth).HasValue && SqlFunctions.IsDate(c.DateOfBirth).Value == 1
&& c.DateOfBirth.StartsWith(day)
&& month == (c.DateOfBirth.Contains("-") || c.DateOfBirth.Contains("/")
? c.DateOfBirth.Substring(c.DateOfBirth.Contains("-") ? c.DateOfBirth.IndexOf("-") + 1 : c.DateOfBirth.Contains("/")
? c.DateOfBirth.IndexOf("/") + 1 : 0, 2) : "f")
&& c.DateOfBirth.EndsWith(year));
}
Как вы можете видеть, приведенное выше выполняет совпадения строк для компонентов даты, месяца и года и ожидает DD / MMYYYY представительство (Aussie Aussie Aussie!).Его можно легко изменить, чтобы он работал с другими представлениями даты и / или включал также ограничения для компонента Time.