Фильтрация Get() в репозитории на основе определенного атрибута

#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>> предикат) { возвращаемые сущности. Где(предикат); }