2013-09-26 5 views
2

Учитывая приведенные ниже образцы моделей, мне нужно запросить ITEMS по свойствам своего владельца. Это набор структур Entity Framework, и я хочу сделать это с помощью 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 с фильтром владельцев.

Я хотел бы применить этот предикат (это в основном контент для предложения where) к объекту Owner, чтобы получить все Item, чей Владелец удовлетворяет условию предиката.

Если Owner был список владельцев ... Я мог бы использовать .Any(predicate), но его мощность равна 1.

EDIT:

Я пытаюсь сделать это, чтобы избежать того, чтобы получить все Owners, который выполняет условия предиката, а затем делает Contains(idOwner).

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

Я видел masive SQL СЛУЧАЙ он создает под капотом для владельцев, которые даже не имеют связанных Items.

РЕДАКТИРОВАТЬ 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; 
} 

Критериев получают из фильтров пользователя. Затем я обычно использую его для запроса коллекции Owners, делающей db.Owners.Where(predicate);

Теперь, концептуально, мне нужно сделать что-то вроде: db.Items.Where(x => /*Items filters*/ && x.MyOwner.Where(myOwnerPredicate))

+0

Является ли 'Владелец 'свойство на' Item' должно быть типа 'Owner', а не' int'? –

+0

Владелец владеет тип Owner, был ошибкой. Я починил это. – Romias

ответ

1

Вы можете просто попробовать:

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

Основываясь на вашем EDIT 2:

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

Nop .. кажется, что, поскольку предикат создан для владельца типа, он не может быть применен для элементов типа. Способом его использования обычно является db.Owners.Where (предикат); ваша идея не компилируется. – Romias

+0

Я пытаюсь сделать это, чтобы не допустить, чтобы все владельцы выполняли предикатные условия, а затем делали Contains (idOwner). Я видел массивный SQL CASE, который он создает под капотом для владельцев, у которых даже нет связанных «элементов». – Romias

+0

Можете ли вы поделиться тем, как вы на самом деле используете свой предикат? Я могу только догадываться, поскольку вы не предоставили достаточной информации, чтобы понять, почему ваш предикат не будет работать таким образом. –

Смежные вопросы