EF Core дочерние коллекции с тем же типом - PullRequest
0 голосов
/ 07 ноября 2018

Учитывая следующие классы, как получить EF Core для сопоставления моих двух коллекций?

public class Foo
{
    public int FooId { get; set; }
    public List<Bar> BarWithTypeA { get; set; }
    public List<Bar> BarWithTypeB { get; set; }
}

public class Bar
{
    public int BarId { get; set; }
    public int FooId { get; set; }
    public int BarType { get; set; }
}

EF Core не позволяет вам сделать это (что было моей первой мыслью):

_context.Foos.Inclue(x => x.BarWithTypeA.Where(w => w.BarType == 1);

Я также безуспешно пытался добавить глобальный фильтр запросов. Я уверен, что это просто, но я нахожусь в точке, где мне нужен свежий набор глаз.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Нет элегантного способа сделать это на земле SQL. В вашем классе Bar может быть два необязательных FooIds для каждого типа:

public class Bar
{
    public int BarId { get; set; }
    public int? FooIdWhenTypeA { get; set; }
    public int? FooIdWhenTypeB { get; set; }
    public int BarType { get; set; }
}

Но то, что я рекомендую, это на самом деле устранение неоднозначности на стороне клиента:

public class Foo
{
    public int FooId { get; set; }
    public List<Bar> Bars { get; set; }

    [NotMapped]
    public List<Bar> BarWithTypeA { get => Bars.Where(x => x.BarType == 1).ToList() }

    [NotMapped]
    public List<Bar> BarWithTypeB { get => Bars.Where(x => x.BarType == 2).ToList() }
}
0 голосов
/ 07 ноября 2018

С точки зрения структуры вашей базы данных, у вас нет двух ссылок между Foo и Bar, есть только одна ссылка, поэтому ваша сущность должна соответствовать этому:

public class Foo
{
    public int FooId { get; set; }
    public List<Bar> Bars { get; set; }
}

Если вам действительно нужны оба этих свойства, вы можете смоделировать их следующим образом:

[NotMapped]
public List<Bar> BarWithTypeA => Bars.Where(b => b.BarType == 1);
[NotMapped]
public List<Bar> BarWithTypeB => Bars.Where(b => b.BarType == 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...