Entity Framework Core: пользовательские методы Linq для запроса моделей представлений из DbContext - PullRequest
0 голосов
/ 15 мая 2018

Я занимаюсь разработкой веб-API .NET Core с использованием .NET Core 2.0 и Entity Framework 2.0. Проект и особенно количество моделей представления продолжают расти, и сложность становится более интенсивной (больше вложенных моделей). Основной вопрос моего вопроса заключается в том, что модели представлений имеют много подмоделей.

Держу пари, я не использую правильные ключевые слова для поиска в Google, потому что не могу найти то, что хочу знать.

В настоящее время я запрашиваю и отображаю их (согласно некоторой определенной логике) непосредственно через DbContext (каждый раз, иначе для каждой модели представления). Например:

List<MyViewModel1> items = await MyDbContext.MyDbModel1
  .Where(dbm1 => dbm1.SomeValue > 10)
  .Select
     (
        dbm1 => new MyViewModel1 
        {
            ValueName = dbm1.SomeValue,
            NestedModel1 = new NestedViewModel1 
            {
               SomeValue1 = dbm1.OtherTableModel1.Value1,
               SomeValue2 = dbm1.OtherTableModel1.Value2
            },
            NestedModel2 = (!dbm1.OtherTableModel2Id.HasValue) ? null :
                  new NestedViewModel2 
                  {
                     SomeCalculatedValue = dbm1.OtherTableModel2.Value1 + dbm1.OtherTableModel2.Value2,
                     SomeOtherValue = dbm1.OtherTableModel2.Value3
                   }
       }
   )
   .ToListAsync();

Теперь проблема в том, что NestedViewModel2 (модель с вычислением) привязана к нескольким моделям представлений, и до сих пор я пишу эти вычисления каждый раз так же, как описано выше (для MyViewModel1, MyViewModel2, MyViewModel3, ...). И как это, требования меняются регулярно. И каждый раз, когда меняются требования, мне приходится определять все места в моем растущем коде и фиксировать вычисления в нескольких местах.

Этот подход не следует за СУХОЙ (не повторяйтесь).

Но я не могу найти информацию, если можно (и как) написать некоторые собственные методы расширения linq (какие рамки сущности будут понимать для преобразования linq в SQL), например:

  • SelectViewModel1WithValueGreaterThan (это DbSet, int большееThan)
  • SelectViewModel2List (этот DbSet)
  • SelectViewModel3Details (этот DbSet)

и, особенно, вложенные модели выбираются в одном месте (это можно вызвать из вышеупомянутых методов).

  • SelectNestedModel1 (???)
  • SelectNestedModel2 (???) * +1027 *

Любые подсказки для меня, как упаковать эти запросы в пользовательские методы расширения linq, чтобы код следовал принципу СУХОЙ и мог использоваться повторно?

1 Ответ

0 голосов
/ 15 мая 2018

Вы должны взглянуть на структуру сопоставления для сопоставления сущностей БД с ViewModels. Например, для этого мы используем Automapper .

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

MappingConfig.CreateMap<MyDbModel1, MyViewModel1>()
    .ForMember(vm => vm.ValueName, o => o.MapFrom(ent => ent.SomeValue))
    .ForMember(vm => vm.NestedModel1, o => o.MapFrom(ent => ent.OtherTableModel1));

MappingConfig.CreateMap<OtherTableModel1, NestedViewModel1>()
    .ForMember(vm => vm.SomeValue1 , o => o.MapFrom(ent => ent.Value1))
    .ForMember(vm => vm.SomeValue2 , o => o.MapFrom(ent => ent.Value2));

var items = Mapper.Map<MyViewModel1[]>(MyDbContext.MyDbModel1.Where(dbm1 => dbm1.SomeValue > 10));
...