Ответ 1
С LINQKit PredicateBuilder вы можете строить предикаты динамически.
var query = from u in context.Users select u;
var pred = Predicate.False<User>();
if (type.HasFlag(IdentifierType.Username))
pred = pred.Or(u => u.Username == identifier);
if (type.HasFlag(IdentifierType.Windows))
pred = pred.Or((u => u.WindowsUsername == identifier);
return query.Where(pred.Expand()).FirstOrDefault();
// or return query.AsExpandable().Where(pred).FirstOrDefault();
Это то, что Expand
для:
Конвейер обработки запросов Entity Framework не может обрабатывать вызовы, поэтому вам нужно вызвать AsExpandable для первого объекта в запросе. Вызывая AsExpandable, вы активируете класс посетителей выражения LINQKit, который заменяет выражения вызова более простыми конструкциями, которые может понять Entity Framework.
Или: без него выражение Invoke
d, что вызывает исключение в EF:
В LINQ to Entities выражение LINQ node type 'Invoke' не поддерживается.
Позднее добавление:
Существует альтернативный построитель предикатов, который делает то же самое, но без Expand: http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/