Использование метода EF Core include внутри каждого может быть проблемой производительности

#c# #entity-framework-core #repository-pattern

Вопрос:

В эти дни я работаю над проектом, и этот проект зависит от другого проекта, который будет воспроизводить репозиторий, на основе моего проекта репозитория Generic Repository pattern . В своем проекте репозитория я создал метод, который будет получать все данные из полученной сущности и загружать данные из выбранных сущностей в полученное выражение.

Мой метод:

 public List<TEntity> GetAll<TEntity>(params Expression<Func<TEntity, object>>[] expressions) where TEntity : class
{
    var result = new List<TEntity>();

    foreach (var expression in expressions)
    {
        result = Context.Set<TEntity>().Include(expression).ToList();
    }

    return resu<
}
 

Вопрос:

Как вы заметите в приведенном выше методе, я использовал Include метод внутри итерации ( Foreach ), поэтому мой вопрос : связано ли использование Include inside foreach с проблемой производительности или какой-либо другой проблемой ?

Комментарии:

1. Учитывая, что вы игнорируете все результаты, кроме последнего выражения, у вас есть проблемы с корректностью , которые необходимо решить, прежде чем вы даже рассмотрите проблемы с производительностью. Как только ваш код заработает , вы сможете оценить его производительность. И когда вы зайдете так далеко, измерьте код, чтобы увидеть, есть ли у вас проблемы с производительностью, вместо того, чтобы спрашивать незнакомых людей, достаточно ли хорошо работает ваш код.

2. у вас проблемы с корректностью , не могли бы вы привести мне несколько примеров ?

3. См. Первую половину моего первого предложения. Если вы намерены игнорировать все выражения, кроме одного, примите только одно, а не список, выполните запрос для всех из них, а затем выбросьте все результаты, кроме одного, на пол.

4. В выражениях я отправлю связанные сущности для загрузки данных из основной сущности и всех отправленных связанных сущностей, поэтому иногда я могу отправить одну сущность, expressions а иногда мне нужно отправить много. И поэтому извините, если у меня возникло недопонимание по поводу вашего комментария, пожалуйста, не могли бы вы дать мне полный ответ и действительно оценить это для вас

Ответ №1:

Вероятно, вам это нужно:

 public List<TEntity> GetAll<TEntity>(params Expression<Func<TEntity, object>>[] expressions) where TEntity : class
{
    var query = Context.Set<TEntity>().AsQueryable();

    foreach (var expression in expressions)
    {
        query = query.Include(expression);
    }

    return query.ToList();
}
 

Комментарии:

1. В любом случае: ben-morris.com/…