Запрос LINQ с EF Core для поиска записей с совпадающими элементами из отношения "многие ко многим" - PullRequest
1 голос
/ 18 июня 2020

Я новичок в. NET и EF Core, и я создаю приложение типа секретного списка. Я хочу сравнить записи и найти подходящие объявления о продаже / разыскиваемых объявлениях на основе их тегов (связанных с помощью отношения многие ко многим в структуре сущностей).

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

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

public bool IsDuplicate(Classified classified)
{
    var idSet = classified.ClassifiedTags.Select(ct => ct.Tag.Id).ToHashSet<int>();
    var query = from c in _context.Classified 
                where c.ClassifiedTags.Select(ct => ct.Tag.Id).ToHashSet<int>().SetEquals(idSet) &&
                      c.User == classified.User
                select c;

    // .... return true if a record is found
}

Для таблиц в EF Core настроено соединение "многие ко многим": Классифицированный <-> Классикатег <-> Тег

Мой ApplicationDbContext выглядит следующим образом

public DbSet<Tag> Tags { get; set; }
public DbSet<Classified> Classified { get; set; }
public DbSet<ClassifiedTag> ClassifiedTags { get; set; }

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Tag>().ToTable("Tag");
    builder.Entity<ClassifiedTag>().ToTable("ClassifiedTag");

    builder.Entity<ClassifiedTag>()
        .HasKey(ct => new { ct.ClassifiedId, ct.TagId });

    builder.Entity<ClassifiedTag>()
        .HasOne(c => c.Classified)
        .WithMany(ct => ct.ClassifiedTags)
        .HasForeignKey(ct => ct.ClassifiedId);

    builder.Entity<ClassifiedTag>()
        .HasOne(t => t.Tag)
        .WithMany(ct => ct.ClassifiedTags)
        .HasForeignKey(ct => ct.TagId);
}

Моя классифицированная модель выглядит так:

public class Classified
{
    public Guid Id { get; set; }
    public int Type { get; set; }
    public ApplicationUser User { get; set; }
    public DateTime DateCreated { get; set; }
    public List<ClassifiedTag> ClassifiedTags { get; set; }
}

public class ClassifiedTag {
    public Guid ClassifiedId { get; set; }
    public Classified Classified { get; set; }
    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

И моя модель тега выглядит так:

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<ClassifiedTag> ClassifiedTags { get; set; }
}

Я чувствую, что это должно быть довольно просто, но я действительно застрял в идеях на данный момент, любая помощь будет действительно оценен!

1 Ответ

2 голосов
/ 18 июня 2020

В вашем запросе ToHashSet<int>() не может быть преобразовано в SQL, и возникает исключение.

...