Предположим, у меня есть две таблицы TableA и TableB. Каждая запись в A имеет одну или несколько связанных записей в B. Скажем, я хочу использовать фильтр многократного использования с использованием предикатов. Я мог бы сделать что-то вроде этого (Linq-на-SQL, кстати):DRY LINQ Предикатные фильтры для нескольких таблиц
private Expression<Func<ARecord, bool>> FilterPredicate()
{
return x => x.Name == "Test";
}
private IQueryable<ARecord> GetRecords()
{
return DataContext.TableA.Where(FilterPredicate());
}
Это прекрасно работает, но сказать, что я хотел искать TableB, но использовать один и тот же «фильтр» на внешнем ключе. Я хочу выполнить запрос ниже, не переписывая FilterPredicate, как он относится к TableB.
var query = from b in DataContext.B
where b.A.Name == "Test"
select b;
Я просто интересно, если есть какие-либо рекомендации по созданию многоразового использования «где» положения, которые могли бы помочь по нескольким таблицам.
Редактировать - Чтобы уточнить, я не ищу способ применить предикат к типам ARecord и BRecord. Я ищу способ (какой-либо образом, не обязательно вдоль линии я уже думал), чтобы предотвратить необходимость этого предиката, а также:
private Expression<Func<BRecord, bool>> FilterPredicate2()
{
return x => x.A.Name == "Test";
}
Спасибо заранее.
«Это, конечно, не сработает, поскольку синтаксический анализатор Linq-To-Sql будет использовать« Имя »вместо фактического свойства« MyName », поэтому он не сможет сопоставить это выражение с правильным SQL». На самом деле, есть способ обойти это - это болезненно, но это работает - http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/5691e0ad-ad67-47ea-ae2c- 9432e4e4bd46 –
См. Мое редактирование. Я ищу фильтр для внешнего ключа, не применяя тот же предикат к типам A и B. – Ocelot20
Это очень помогло мне. Меня повесили на попытке использовать интерфейс непосредственно в качестве параметра в предикате. Спасибо. – Ben