Entity Framework Модель отношений один ко многим - Как выбрать столбец из дочерней таблицы - PullRequest
0 голосов
/ 20 марта 2020

Моя общая цель - вернуть награды с TeamIds, которые соответствуют списку идентификаторов, переданных из фильтра. Я ищу

  1. Проверка правильности построения моей модели
  2. Помощь в написании кода для возврата вознаграждений (необходим тип возврата IQueryable).

Вот упрощенная версия моей модели. Одна награда может иметь много команд, связанных с ней. Кроме того, у одной команды может быть много наград (но меня это не волнует. Мне нужно только go от Награды до команды).

public class Award
    {
        [Key]
        [ForeignKey("Teams")]
        public int AwardId { get; set; }

        //navigation property
        public virtual ICollection<AwardTeamMap> Teams{ get; set; }

    }


    public class AwardRoleMap
    {

        [Key, Column(Order = 0)]
        public int AwardId { get; set; }

        [Key, Column(Order = 1)]
        public int TeamId { get; set; }


    }

В моем dbcontext у меня есть это:

modelBuilder.Entity<Award>()
                .HasMany(m => m.GuruTeams)
                .WithOptional()
                .HasForeignKey(a => a.AwardId);

Теперь я пытаюсь вернуть награды с TeamIds, которые соответствуют целым числам, предоставленным фильтром, с которым взаимодействует пользователь (filter.IntValues).

Когда я запускаю это, я может ли это ошибка времени выполнения: в этом контексте поддерживаются только примитивные типы или типы перечисления.

Я чувствую, что должен быть лучший способ получить TeamIds, но я изо всех сил.

var awards = from award in baseAwardQuery
                         from AwardTeams in db.Awards.Queryable.Where(a => filter.IntValues == a.Teams.Select(x => x.TeamId)
                          && a.AwardId == award.AwardId)
                          select award;

1 Ответ

0 голосов
/ 20 марта 2020

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

Сначала вы получили эти модели сущностей

public class Team
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<TeamAward> AwardOfTeam { get; set; }

}

public class TeamAward
{
    public int TeamId { get; set; }
    public int AwardId { get; set; }

    public virtual Team Team { get; set; }
    public virtual Award Award { get; set; }
}

public class Award
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<TeamAward> TeamHasAward { get; set; }

}

И затем, в своей функции вы можете запросить как это

// I don't know what is your filter.IntValues so I guess it is array of int
int[] teamIds = new[] { 1, 3, 4 };
// This is list of all award that Team 1, Team 3 and Team 4 got
List<Award> awards = context.Teams
                     .Where(team => teamIds.Contains(team.Id))
                     .SelectMany(team => 
                                 team.AwardOfTeam.Select(awardOfTeam =>
                                                         awardOfTeam.Award)).ToList();
// Do your stuff here
// foreach (Award award in awards)

Надеюсь, что эта помощь

...