2013-09-26 1 views
2

아래 예제 모델에서 소유자의 속성으로 ITEMS를 쿼리해야합니다. 이것은 Entity Frameworks 집합이며 LINQ를 사용하여이 작업을 수행하려고합니다.PredicateBuilder를 적용하여 항목 목록의 단일 개체 속성 쿼리

public class Owner 
    { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    //More than 20 other properties 
    } 

    class Item 
    { 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public Owner MyOwner { get; set; } 
    public int idOwner { get; set; } 
    //Several others properties 
    } 

나는 소유자의 필터가 이미 PredicateBuilder입니다.

Owner 개체에이 술어 (기본적으로 where 절의 내용)를 적용하여 소유자가 조건 자 조건을 충족하는 모든 Item을 얻고 싶습니다.

Owner은 소유자의 목록이 있다면 ... 나는 .Any(predicate)를 사용할 수 있지만 기본은 1

편집 : 나는 모든 얻을 것을 피하기 위해이 작업을 수행하기 위해 노력하고있어

조건 자 조건을 충족하는 Owners을 입력 한 다음 Contains(idOwner)을 수행하십시오.

db.Items.Where(c => OwnerIdsCollection.Contains(c.idOwner ?? 0)); 

나는 심지어 Items 관련하지 소유자를위한 후드 작성 masive SQL 사례를 보았다.

EDIT 2 - 술어 :

public static Expression<Func<Owner, bool>> GetPredicate(OwnerCriteria criteria) 
{ 
    var predicate = PredicateBuilder.True<Owner>(); 

    if (criteria.Active.HasValue) { 
    predicate = predicate.And(p => p.Active == criteria.Active.Value); 
    } 
    //Several other criateria checkings as above 

    return predicate; 
} 

기준은 사용자 필터로부터 얻어진다. 그런 다음 일반적으로 소유자 컬렉션을 쿼리하는 데 사용합니다. db.Owners.Where(predicate); db.Items.Where(x => /*Items filters*/ && x.MyOwner.Where(myOwnerPredicate))

+0

는'소유자 : 당신의 편집 2

Items.Where(i => predicate(i.Owner)) 

을 바탕으로

이제

는 개념적으로, 내가 좋아하는 뭔가를 할 필요가 'Item'에 'int'가 아닌'Owner' 타입의 속성이 있습니까? –

+0

소유자가 소유자 유형이며 실수였습니다. 나는 그것을 고쳤다. – Romias

답변

1

는 단순히 시도 할 수 :

db.Items.AsExpandable().Where(x => /*Items filters*/ && predicate.Invoke(x.Owner)) 
+0

Nop .. 술어가 유형 소유자 용으로 작성되었으므로 유형 항목에 적용 할 수없는 것으로 보입니다. 정상적으로 사용하는 방법은 db.Owners.Where (술어)입니다. 당신의 아이디어는 컴파일되지 않습니다. – Romias

+0

나는 predicate 조건을 만족하는 모든 소유자를 얻지 않고 Contains (idOwner)를 수행하지 않으려 고이 작업을 수행하려고합니다. 필자는 관련 '항목'이없는 소유자를 위해 후드 아래에 생성되는 진부한 SQL CASE를 보았습니다. – Romias

+0

실제로 어떻게 귀하의 술어를 사용하고 있는지를 공유 할 수 있습니까? 나는 당신이 당신의 술어가 왜 이런 식으로 작동하지 않는지 이해할 수있는 충분한 정보를 제공하지 않았기 때문에 추측 할 수 있습니다. –