Entity Framework Core: объединение нескольких объектов результатов в одну коллекцию - PullRequest
0 голосов
/ 23 мая 2018

Я сталкиваюсь с этим запросом linq для ядра платформы сущностей (2.0).

  var result = await dbContext.Table1DbSet
.Where(t1e => t1e.Id == id && t1e.Id2 == id2)
.Select
(
  t1e =>
  t1e.Table2NavPropICollection.Select
  (
    t2e => new
    {
      singleObject = t2e.Table3NavPropObject.TargetObject,
      enumerable1  = t2e.Table3NavPropObject.Table4NavPropObject.Table5NavPropICollection.Select(t5e => t5e.TargetObject),
      enumerable2  = t2e.Table3NavPropObject.Table6NavPropObject.Table7NavPropICollection.Select(t7e => t7e.TargetObject),
      enumerable3  = t2e.Table3NavPropObject.Table8NavPropICollection.SelectMany(t8e => t8e.Table9NavPropICollection.Select(t9e => t9e.TargetObject))
    }
  )
)
.ToListAsync();

Цель состоит в том, чтобы запросить все ссылочные экземпляры объекта TargetObject, на который ссылается ~ 10 различных таблиц.

В настоящее время он возвращает IEnumerable, где анонимный объект содержит свойства singleObject, enumerable1, enumerable2, enumerable3.Все эти свойства имеют тип TargetObject или IEnumerable.

Могу ли я и каким образом переписать запрос, чтобы не возвращать анонимные объекты, а просто IEnumerable, содержащий все значения?

По какой-то причине компиляторне позволит мне перебрать анонимную коллекцию и выровнять ее вручную.

Ответы [ 2 ]

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

Это должно сработать, если вам нужен один массив на строку t1e.

      var result = await dbContext.Table1DbSet
    .Where(t1e => t1e.Id == id && t1e.Id2 == id2)
    .Select
    (
      t1e =>
      t1e.Table2NavPropICollection.Select
      (
        t2e => new[] {t2e.Table3NavPropObject.TargetObject}.Concat(
            t2e.Table3NavPropObject.Table4NavPropObject.Table5NavPropICollection.Select(t5e => t5e.TargetObject)).Concat(
            t2e.Table3NavPropObject.Table6NavPropObject.Table7NavPropICollection.Select(t7e => t7e.TargetObject)).Concat(
            t2e.Table3NavPropObject.Table8NavPropICollection.SelectMany(t8e => t8e.Table9NavPropICollection.Select(t9e => t9e.TargetObject)))
      )
    )
    .ToListAsync();

Если вы хотите, чтобы он был полностью плоским, вы захотите переключить этот Select на SelectMany ().

      var result = await dbContext.Table1DbSet
    .Where(t1e => t1e.Id == id && t1e.Id2 == id2)
    .SelectMany
    (
      t1e =>
      t1e.Table2NavPropICollection.Select
      (
        t2e => new[] {t2e.Table3NavPropObject.TargetObject}.Concat(
            t2e.Table3NavPropObject.Table4NavPropObject.Table5NavPropICollection.Select(t5e => t5e.TargetObject)).Concat(
            t2e.Table3NavPropObject.Table6NavPropObject.Table7NavPropICollection.Select(t7e => t7e.TargetObject)).Concat(
            t2e.Table3NavPropObject.Table8NavPropICollection.SelectMany(t8e => t8e.Table9NavPropICollection.Select(t9e => t9e.TargetObject)))
      )
    )
    .ToListAsync();
0 голосов
/ 23 мая 2018

Является ли Add и / или Concat возможным решением?

PoC:

var a = new [] { 1,2,3 };

var result = new {
    firstA = a.First(),
    otherAs = a,
    backwards = a.Reverse()
};

var final = new List<int>();
final.Add(result.firstA);
final.Concat(result.otherAs.Concat(result.backwards))
    .Dump();
...