#c# #asp.net #entity-framework
Вопрос:
Я новичок в Entity Framework и немного запутался в фильтрации метода Get (). Я хочу добавить фильтр, в котором база данных будет извлекать данные только по определенным атрибутам, которые мне придется динамически указывать. В основном он будет генерировать выражение на основе строки запроса.
В настоящее время у меня есть этот фильтр в моем методе Get() :
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = Entities;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
Итак, моя командная модель имеет 3 атрибута, которые являются:
public virtual string TeamId { get; set; }
public virtual string ChannelId { get; set; }
public virtual string Name { get; set; }
Поэтому в основном я хочу получить все данные в сущности команды конкретного человека, используя атрибут Name, например, такой $filter=Name eq ‘XYZ’:
Комментарии:
1. Этот метод вы создали сами или это переопределение чего-то? Обычно классы DbContext имеют метод Find() для поиска сущностей по идентификатору, и если вам нужны определенные фильтры, вам следует использовать другие методы Linq, такие как FirstOrDefault (), Where (), OrderBy (), Select()
2. И вы, похоже, создаете очень общий метод в слое репозитория, который будет вызываться на уровне более высокого уровня, таком как приложение. Я не думаю, что это хорошая идея-создавать такой универсальный метод, как этот. Вы можете изменить свои методы в бизнесе/репозитории, чтобы они были больше похожи на GetAll (), GetById(), GetOrdered(), getByName() и так далее. Потому что все запросы будут сосредоточены на бизнес-уровне. Таким образом, то, что вы делаете, вы переносите ответственность за запросы на уровень приложений, и это может рассматриваться как плохая практика проектирования
3. @DouglasFerreira Хорошо, поэтому я сделал метод Find (). Поможет ли этот синтаксис мне получить то, чего я хочу достичь? общедоступный IEnumerable<TEntity> Найти(System.Linq. Выражения. Выражение<Функция<Значение, bool><Значение, bool>> предикат) { возвращаемые сущности. Где(предикат); }