Я пишу веб-приложение, которое доступно только для чтения, я имею в виду, что данные читаются из базы данных и представляются в пользовательском интерфейсе, поэтому мои методы обслуживания 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 для улучшения.