У меня есть следующие 2 сущности в моем db.Содержит по крайней мере все в структуре Entity
public class Article
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
// Some code removed for brevity
public virtual ICollection<Tag> Tags { get; set; }
}
public class Tag
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
// Some code removed for brevity
public virtual ICollection<Article> Articles { get; set; }
}
Мне нужно отфильтровать эти статьи на основе идентификаторов тегов, которые переданы в мое действие.
public ActionResult FindAll(List<int> tags)
{
//
// I need to return all articles which have ALL the tags passed into this method
//
var query = ApplicationDbContext.Articles...
}
Например, если я прошел в 1, 2, 3 в действие, только статьи, которые имели эти 3 метки или больше будут возвращены.
Как я могу это достичь?
Спасибо за отличный ответ!
Все ваши ответы дали правильный результат, поэтому я сделал быстрое, базовое профилирование в sql, и это были результаты, основанные на ваших запросах.
Для тех '' All' ответы Except' и, вы можете проверить, чтобы убедиться, что производительность является приемлемой для нагрузки вы ожидали, и что сгенерированный SQL все еще работает, если 'tags.Count' большой. См. Комментарии в разделе [this] (http://stackoverflow.com/questions/30947278/ef-intersect-syntax/30948394#comment49949396_30947688) для более подробной информации. Это может стоить запросить надмножество статей (с любыми тегами?) И дальнейшей фильтрации. – jjj
Если ни один из ответов не работал или вы все еще сталкиваетесь с проблемами, сообщите мне, чтобы я мог помочь – AmmarCSE
Мне любопытно: сколько тэгов вы использовали для этих тестов, насколько велика таблица 'Articles' и насколько велика была результирующий набор? – jjj