Я использую Entity Framework 4.3.1 с подходом Code First. Кроме того, я использую LinqKit, чтобы использовать PredicateBuilder.
Если у меня есть такие таблицы:
Местоположение, часовой пояс (Много :1)
..и я хочу что-то подобное:
Expression<Func<TimeZone, bool>> pred = PredicateBuilder.True<TimeZone>();
pred = pred.And(tz => tz.TimeZoneCode == "EST");
List<Location> locations = context.Locations
.AsExpandable().Where(pred)
.Select(loc => loc).ToList();
Это не работает, потому что предикат создан для приема TimeZone, но метод Where ()получает Location.
Я могу переписать предикат таким образом, но я не хочу, потому что я хочу иметь фабрику предикатов, которая создает предикаты для определенных типов (Я не хочу использовать свойства Navigator таким образом):
Expression<Func<Location, bool>> pred = PredicateBuilder.True<Location>();
pred = pred.And(loc => loc.TimeZone.TimeZoneCode == "EST");
Какой синтаксис я мог бы использовать (, если таковой имеется ), чтобы использовать предикат, созданный в первом примере, где он принимает часовой пояс, вместо того, чтобы принимать местоположение и проходить по дереву через свойства навигации (, как это менее пригодны для повторного использования ). Было бы неплохо, если бы был способ использовать знания EF о свойствах навигации в первую очередь и иметь возможность использовать предикат, связанный с типом свойства навигации.