2015-04-22 6 views
0

У меня есть эта модель:Использование Linq Где на дочернем объекте в выражении лямбда?

public class User 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public virtual ICollection<UserProperty> Properties {get; set;} 
} 

public class UserProperty 
{ 
    public int Id {get; set;} 
    public int UserId {get; set;} 
    public int PropertyId {get; set;} 
    public virtual User User {get; set;} 
    public virtual Property Property {get; set;} 
} 

public class Property 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public bool IsActive {get; set;} 
} 

У меня есть метод репозитория:

public virtual IQueryable<User> Get(Expression<Func<User, bool>> predicate, params Expression<Func<User, object>>[] include) 
{ 
    var set = include.Aggregate<Expression<Func<User, object>>, IQueryable<User>> 
       (dbSet, (current, expression) => current.Include(expression)); 

    return set.Where(predicate); 
} 

Я пытаюсь получить список пользовательских свойств, где IsActive от свойств является истинным, так что я делаю :

public IEnumerable<UserProperty> GetSearches(int userId) 
{ 
    return userRepository.Get(x => x.Id == userId, 
           x => x.Properties.Where(p => p.Property.IsActive).Select(p => p.Property)).Properties; 
} 

Однако я получаю это исключение:

Выражение пути Include должно ссылаться на свойство навигации, определенное в типе. Используйте пунктирные пути для ссылочных навигационных свойств и оператор Select для свойств навигации для коллекции. Имя параметра: путь

Что я делаю неправильно?

EDIT

следующие альтернативные работы:

return userRepository.Get(x => x.Id == userId, 
          x => x.Properties.Select(p => p.Property)).Properties.Where(p => p.Property.IsActive); 

Однако, где положение не включено в заявление SQL к БД, но выполняется после того, как все записи были получены.

Я хотел бы ограничить количество записей, полученных непосредственно в db.

+0

Возможно, это поможет http://stackoverflow.com/questions/16798796/ef-include-with-where-clause –

ответ

1

Я хотел бы сделать что-нибудь попроще:

public IEnumerable<UserProperty> GetSearches(int userId) 
{ 
    return userRepository.Where(x => x.Id == userId).Select(x => x.Properties.Where(p => p.IsActive)).Single(); //I assumed userId is unique 
} 

Если нужно сгруппировать свойства ещё пользователя затем использовать GroupBy.

+0

Я хотел бы использовать метод репозитория выше. UserRepository не является IDbSet, а классом, который наследуется от общего репозитория. –

+0

Ну, тогда вы должны иметь возможность получить таблицу из репо, как IEnumerable или IQueryable. –

+0

'Выбрать (p.Properties.Where (x => x.IsActive))' не компилируется. –

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