Почему мой запрос не может загрузить связанные данные в EF?

Самый короткий фрагмент кода, о котором я могу думать, это:

URI uri = new URI("http://www.stackoverflow.com/path/to/something");

URI parent = uri.getPath().endsWith("/") ? uri.resolve("..") : uri.resolve(".")
0
задан Camilo Terevinto 17 March 2019 в 23:36
поделиться

1 ответ

Include будет выполнять только активную нагрузку, это не обязательно при выполнении операции Select. Из того, что я вижу, код, который вы предоставили, даже не должен компилироваться, если вы пытаетесь загрузить Parameter и ProductParameter из сущности Product, и у этой сущности нет ни одной из этих ссылок.

Первое, на что нужно обратить внимание - это отношения между вашими сущностями. Глядя на вашу объектную модель, вы видите, что между Product и ProductType есть много к 1, а затем много ко многим между Product и Parameter, чему способствует таблица ProductParameter. Существует также набор параметров для ProductType, который я был бы довольно подозрительным. При работе со связями я рекомендую использовать однонаправленные ссылки по умолчанию и включать двунаправленную ссылку, только если это необходимо. Например, для продукта требуется ссылка на тип продукта, однако действительно ли тип продукта требует ссылки на все продукты этого типа? (мы все еще можем получить это, если нам это нужно, сделав запрос в Product). С меньшим количеством двунаправленных ссылок легче работать.

Чтобы получить DTO вашего продукта, вам нужно будет указать, представляет ли DTO продукт (с его параметрами) или комбинацию одного продукта и параметра. Один продукт имеет несколько параметров, поэтому, если DTO представляет один продукт, DTO должен будет обрабатывать набор параметров. Если DTO представляет комбинацию продукта и параметра, то продукт с 3 связанными параметрами приведет к созданию 3x DTO.

Для этого второго случая, учитывая структуру DTO, которая у вас есть в данный момент, вы бы посмотрели на запрос Linq, который выглядит примерно так:

   var items = await _context.Products
        .SelectMany(p => p.ProductParameters)
        .Select(pp => new ProductDTO
         {
           ProductId = pp.ProductId,
           Number = pp.Product.Number,
           Amount = pp.Product.Amount,
           PrimeCostEUR = pp.Product.PrimeCostEUR,
           NameType = pp.Product.ProductType.NameType,
           ProductTypeId = pp.Product.ProductTypeId,
           Name = pp.Parameter.Name,
           Value = pp.Value
         })
          .Where(pp => pp.Product.ProductTypeId == 1)
          .ToListAsync();
    return items;

Запрос будет выполняться для ProductParameters для получения доступа к продукту и каждый из параметров, а также значение параметра продукта.

0
ответ дан Steve Py 17 March 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: