Я новичок в. 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; }
}
Я чувствую, что это должно быть довольно просто, но я действительно застрял в идеях на данный момент, любая помощь будет действительно оценен!