Как выполнить запрос отношения «многие ко многим» с помощью Entity Framework Core 2.1? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь выбрать данные из отношения многие ко многим, используя EF Core (Code First), и получаю следующую ошибку:

Необработанное исключение: System.ArgumentException: должно быть приведеноузел

Не думаю, что я делаю что-то особенно странное, и я могу с радостью выполнить рассматриваемый запрос, используя LinqToSQL в LinqPad.Надеюсь, кто-то может указать, где я ошибаюсь?

Я создал минимальное (и надуманное) воспроизведение в консольном приложении, которое можно найти здесь .По сути, я смоделировал отношение многие ко многим, используя объединяющуюся таблицу: следует :

public class Foo
{
    [Key]
    public int Id { get; set; }

    public ICollection<FooBar> FooBars { get; set; } = new List<FooBar>();
}

public class Bar
{
    [Key]
    public int Id { get; set; }

    public string Value { get; set; }

    public ICollection<FooBar> FooBars { get; set; } = new List<FooBar>();
}

public class FooBar
{
    [Required]
    public int FooId { get; set; }

    [ForeignKey(nameof(FooId))]
    public Foo Foo { get; set; }

    [Required]
    public int BarId { get; set; }

    [ForeignKey(nameof(BarId))]
    public Bar Bar { get; set; }
}

Я хотел бы создать поиск Value из объекта Bar сId из Foo в качестве ключа, используя следующий запрос :

ILookup<int, string> data = 
    this.context.Foos
        .SelectMany(f => f.FooBars.Select(fb => new { f.Id, fb.Bar.Value }))
        .ToLookup(fb => fb.Id, fb => fb.Value);

Перед ошибкой я получаю в консоли следующее предупреждение:

Microsoft.EntityFrameworkCore.Query [20500] Выражение LINQ 'из <> f__AnonymousType0 2 <generated>_0 in {from FooBar fb in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 1 [ReducibleNodeDemo.FooBar]) присоединяется к бару fb.Bar со значением (Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable * 1029)= [f] .Id, Value = [fb.Bar] .Value)} 'не может быть переведен и будет оцениваться локально.

Я относительно новичок в EF Core, но работаюс EF6 в течение многих лет, и никогда не было проблем с такими простыми запросами, как этот!

1 Ответ

0 голосов
/ 21 октября 2018

Очевидно, что вы попали в текущую ошибку реализации EF Core, поэтому рассмотрите возможность сообщения об этом их средствам отслеживания проблем.

Кажется, это вызвано Select внутри SelectMany и использованием внешнего параметра f внутри внутренней лямбды.Обходной путь должен использовать перегрузку SelectMany с селектором элемента:

.SelectMany(f => f.FooBars, (f, fb) => new { f.Id, fb.Bar.Value })

, который, как я считаю, используется компилятором C #, когда вы используете эквивалентный синтаксис запроса LINQ

(from f in this.context.Foos
 from fb in f.FooBars
 select new { f.Id, fb.Bar.Value })

ДругойОбходной путь / решение в данном конкретном случае - запустить запрос непосредственно с FooBar (одно из преимуществ множества-многих с явным объединением)

this.context.Set<FooBar>()
    .Select(fb => new { fb.Foo.Id, fb.Bar.Value });
...