내 서투른 설명을 용서,하지만 난 목록을 포함하는 클래스가 있습니다 List <T>을 속성으로 사용하여 개체를 쿼리하는 식 트리를 생성하려면 어떻게해야합니까?
public class Document
{
public int OwnerId { get; set; }
public List<User> Users { get; set; }
public Document() { }
}
public class User
{
public string UserName { get; set; }
public string Department { get; set; }
}
은 현재 내가 내 개체에 동적 쿼리를 수행 할 PredicateBuilder를 사용합니다. 내가 식 트리에 다음 LINQ 문을 설정할 수 있습니다 방법 : 즉
var deptDocs = documents.HasUserAttributes("Department", "HR").ToList();
에서
var predicate= PredicateBuilder.True<User>();
predicate= predicate.And<User>(user => user.Deparment == "HR");
var deptDocs = documents.AsQueryable()
.Where(doc => doc.Users
.AsQueryable().Count(predicate) > 0)
.ToList();
. 내가 말할 수있는 것부터, Expression.Invoke를 발행 할 경우 내 문제로 user => user.Deparment == "HR"
행을 평가할 수 없습니다.
UPDATE :
var predicate = PredicateBuilder.True<User>();
predicate = predicate.And<User>(user => user.Department == "FIN");
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 lambda = Expression.Lambda<Func<Document, bool>>(body, docParm);
var allPredicate = PredicateBuilder.True<Document>();
allPredicate = allPredicate.And<Document>(doc => doc.OwnerId == 1);
allPredicate = allPredicate.And<Document>(lambda);
var hrDocs = this.docs.AsQueryable().Where(allPredicate).ToList();
이 할 수있는보다 효과적인 방법이 있나요 : 나는이에 대한 몇 가지 진전을 생각
? 어떻게 predicate - user => user.Department - generics를 생성하는 표현식을 만들 수 있습니까?
흥미 롭습니다 - 게시물을 이해하면 미리 검색어를 등록 하시겠습니까? 이 접근 방식을 사용 했습니까? –
오른쪽; 컴파일하기 전에 쿼리를 빌드해야합니다. 저는이 접근법을 정신으로 사용했지만이 특정 툴킷으로는 사용하지 않았습니다. –