Как улучшить этот запрос Entity Framework Core?

Я пишу веб-приложение, которое доступно только для чтения, я имею в виду, что данные читаются из базы данных и представляются в пользовательском интерфейсе, поэтому мои методы обслуживания BLL состоят в основном из запросов linq, таких как:

return context.SomeLinqQuery

Если мне нужно какое-то вычисление, я делаю это в методе Select() и мне интересно, это правильно?

Другой вопрос - это лучший способ написать приведенный ниже пример запроса? Я хотел бы написать код в соответствии с хорошими практиками, и я не уверен, является ли размещение всего в Select() одним из них.

Мне тоже интересно, если вызов _context в Select() является неправильным или нет. Если это не так, как я могу решить это? Должен ли я загрузить SomeProperty в дополнительный цикл?

_context.SomeEntity
        .Where(some condition)
        .Select(x => new MyModel()
                {
                    Id = x.Id,
                    Name = x.Name,
                    SomeProperty = x.Status == 1
                        ? _context.DbViewModel.Where(condition).Select...
                        : _context.AnotherDbViewModel.Where(condition).Select...
                });

Всего 2 ответа


Если мне нужно какое-то вычисление, я делаю это в методе Select (), и мне интересно, это правильно?

Да! Верный! до тех пор, пока EF Core может преобразовывать выражение, сгенерированное вашим запросом LINQ в T-SQL .

Другой вопрос - это лучший способ написать приведенный ниже пример запроса? Я хотел бы написать код в соответствии с хорошими практиками, и я не уверен, является ли размещение всего в Select() одним из них.

Это будет зависеть от отношений между вашими сущностями. Лучше построить запрос, используя свойства навигации.

Мне тоже интересно, если вызов _context в Select() является неправильным или нет. Если это не так, как я могу решить это? Должен ли я загрузить SomeProperty в дополнительный цикл?

Ничего плохого, если EF Core может оценить запрос на уровне базы данных.


Способ улучшить EF Query - позволить DB выполнять все запросы и возвращать ожидаемое представление напрямую.

Я не могу добавить больше кода, но ваш код должен выглядеть примерно так:

_context.SomeEntity
    .Join(DbViewModel,condition)...
    .Join(AnotherDbViewModel,condition)...
    .Where(some condition)
    .Select({
                Id = x.Id,
                Name = x.Name,
                SomeProperty = x.SomePropety.
            })

Другое решение - использовать DBQuery. Вот хороший пример. а также используйте ExecuteSqlCommand или FromSQL

если ваш LINQ очень сложный, вы также можете использовать CompiledQuery для улучшения.


Есть идеи?

10000