Я нашел несколько удовлетворительное решение, где я могу выполнить запрос с синтаксисом, как показано ниже:
var predicate = PredicateBuilder.True<Document>();
predicate = predicate.And<Document>(User.SubQuery("UserName", "DAVER"));
predicate = predicate.And<Document>(AdHoc<Document>("OwnerId", 1));
var finDocs = docs.AsQueryable().Where(predicate).ToList();
У меня есть класс расширения с этим методом:
public static Expression<Func<T, bool>> AdHoc<T>
(string columnName, object compValue)
{
// Determine type of parameter
ParameterExpression parameter = Expression.Parameter(typeof(T), "x");
// Target to compare to
Expression property = Expression.Property(parameter, columnName);
// The value to match
Expression constant = Expression.Constant(compValue, compValue.GetType());
Expression equality = Expression.Equal(property, constant);
Expression<Func<T, bool>> predicate =
Expression.Lambda<Func<T, bool>>(equality, parameter);
return predicate;
}
И в моем классе User у меня есть статический метод:
public static Expression<Func<Document, bool>> SubQuery(string property,
string targetValue)
{
var predicate = PredicateBuilder.True<User>();
predicate = predicate.And<User>(Extensions.AdHoc<User>(property, targetValue));
Expression<Func<Document, bool>> userSelector =
doc => doc.Users
.AsQueryable()
.Any(predicate);
var docParm = Expression.Parameter(typeof(Document), "appDoc");
var body = Expression.Invoke(userSelector, docParm);
var docPredicate = PredicateBuilder.True<Document>();
docPredicate = docPredicate.And<Document>(Expression.Lambda<Func<Document, bool>>(body, docParm));
return docPredicate;
}
Недостатком является то, что я включил функциональность подзапроса в сам класс User. Он выполняет свою работу, но если у кого-то есть какие-либо предложения или лучший способ использовать непатентованные средства, чтобы мне не приходилось включать этот статический метод в свой класс User, я очень хочу услышать, что вы хотите сказать.