Как использовать построитель предикатов с linq2sql и оператором OR
У меня есть две таблицы (TABLE1, TABLE2 - уникальная, я знаю), которые имеют отношение 1-ко-многим соответственно и внешний ключ между столбцами идентификаторов обеих таблиц.
Используя linq2sql, я пытаюсь выбрать все записи TABLE1 так, чтобы их соответствующие значения TABLE2 содержали как минимум 1 элемент в списке, который я передаю.
Вот пример кода, который я использовал в LINQPad (потрясающая программа), чтобы проверить его, однако я получаю ошибку NotSupportedException: неподдерживаемая перегрузка, используемая для оператора запроса 'Any'.
long[] items = { 3, 5, 8 };
var predicate = PredicateBuilder.False<TABLE2>();
foreach (long i in items)
{
long t = i;
predicate = predicate.Or(att => att.ID == t);
}
//TABLE2.Where(predicate).Dump(); //works like a charm
IQueryable query =
from t1 in TABLE1
where t1.TABLE2.AsQueryable().Any(predicate) //problem with this line
select a;
query.Dump();
ОБНОВИТЬ
При использовании LinqKit в LinqPad добавьте ссылку на LinqKit.dll, снимите флажок Включить PredicateBuilder, а затем также добавьте LinqKit на вкладке "Импорт дополнительных пространств имен".
1 ответ
Обходной путь
- Вызовите AsExpandable() на
TABLE1
объект - Вызовите Compile() для переменной выражения, когда она используется в EntitySet.
Итак, ваш последний запрос
IQueryable query =
from t1 in TABLE1.AsExpandable()
where t1.TABLE2.Any(predicate.Compile()) //the problem should disappear
select a;
Больше информации здесь.