Я нашел ответы для аналогичной концепции, но ни один из них, похоже, не соответствует моему делу.Анализ Дата Дата DateTime с двоичным выражением
Я создаю объект, который фильтрует результаты с помощью предложения Where и Lambda для типов, известных во время выполнения.
Массив фильтра может содержать один или несколько фильтров с именем свойства и оператором равенства (т. Е. Gte, eq, neq и т. Д.) И значением для сравнения.
Так как у меня могло быть более одного свойства для фильтрации, я сначала захватил все BinaryExpression, которые мне нужно сравнить с любым свойством объекта и объединить их в одном выражении, которое передается в запрос Where where.
Если тип свойства фильтра - DateTime, я хочу сравнить только часть даты свойства с помощью BinaryExpression.
У меня есть метод, который получает имя параметра фильтра и его значение.
public static Expression<Func<T, bool>> GetEqualExpression<T>(string parameterName,
string comparisonValue) {
var param = Expression.Parameter(typeof(T), parameterName);
var property = Expression.Property(param, parameterName);
var propInfo = (PropertyInfo) property.Member;
var propType = propInfo.PropertyType;
if (propType == typeof(DateTime)) {
// Parse the string to a DateTime.
const string dateFormat = "ddd MMM d yyyy HH:mm:ss 'GMT'K";
var parsedDate = DateTime.ParseExact(comparisonValue, dateFormat, CultureInfo.InvariantCulture);
// Trying to access the 'Date' child property.
property = Expression.Property(property, "Date");
var constant = Expression.Constant(parsedDate.Date);
return Expression.Lambda<Func<T, bool>>(Expression.Equal(property, constant), param);
}
...
}
учетом, например объект как:
public class Ticket {
public DateTime StartDate {get; set;}
public DateTime DueDate {get; set;}
}
и фильтр для имущества «STARTDATE», когда я прохожу выражение «параметра лямбда в запросе, где положение, он терпит неудачу с исключением не в области.";
Что мне не хватает?
Заранее спасибо.
Update
Таким образом, благодаря xanatos я обнаружил, что ServiceStack.OrmLite (ОРМ я использую) не поддерживает доступ к свойству Date, так же, как EF. Итак, теперь вопрос: как я могу решить эту ситуацию?
Да, извините, Expression.Equals - опечатка, я на самом деле использую Expression.Equal. Я не использую EntityFramework, а ServiceStack.OrmLite. Слияние выражений отлично работает с простыми типами в виде строки и чисел. Я подчеркнул концепцию, чтобы указать, что я не могу получить доступ к собственности напрямую. (например, в query.Where (q => q.StartDate.Date == parsedDate.Date) –
@RobertoMauro Попробуйте проверить, можно ли выполнить запрос с 'Date' без использования выражения (так что построение действительно запроса типа' query. Где (q => q.StartDate.Date == someDate.Date) ', просто чтобы проверить, поддерживает ли Orm. – xanatos
Да, вы правы, он не поддерживает доступ к свойству Date. Я принимаю это как должное. Я полагаю, что я ввернулся.: \ –