У меня есть эта модель:Использование 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.
Возможно, это поможет http://stackoverflow.com/questions/16798796/ef-include-with-where-clause –