Факторизовать общий фильтр в linq для сущностей - PullRequest
0 голосов
/ 24 мая 2018

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

var usaCustomer = Context.Customer.Where(x => x.Country == "USA" && FilterDate(x.DateMeeting)).ToList() ;
var happySeeder = Context.Seeder.Where(x => x.Feel == "Good" && FilterDate(x.LastConnection)).ToList() ;

Итак, вопрос в том, как я могу объявить функцию FilterFunction для некоторой проверки заданной даты и времени или как я могу изменить свое предложение where, чтобы иметь собственный фильтр и общий фильтр?

Заранее спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

Это совершенно невероятно FilterDate() будет работать.Помните, что выражение, которое вы пишете в предложении Where(), будет преобразовано в SQL и отправлено на SQL Server (или в другую БД) ... SQL Server не знает о FilterDate(), и вы получите исключение (Entity Framework).

Можно создать метод FilterDate, который возвращает Expression<>, например

// Filter only for dates >= 1 jan 2000
public static Expression<Func<TSource, bool>> FilterDate<TSource>(Expression<Func<TSource, DateTime>> exp)
{
    var body = exp.Body;
    var date = new DateTime(2000, 1, 1);

    // exp >= 1 jan 2000
    var body2 = Expression.GreaterThanOrEqual(exp.Body, Expression.Constant(date));
    var lambda = Expression.Lambda<Func<TSource, bool>>(body2, exp.Parameters);
    return lambda;
}

, а затем

Expression<Func<Customer, bool>> filterA = x => x.Country == "USA";
Expression<Func<Customer, bool>> filterB = FilterDate<Customer>(x => x.DateMeeting);

и затем составьте это выражение, например, используя код из this ,

var filterC = filterA.And(filterb);
var usaCustomer = Context.Customer.Where(filterC);

, но поверьте мне, это боль с небольшим выигрышем.И это сложно.К сожалению, деревья выражений очень трудно составить.

...