Вернуть продукты, которые принадлежат всем тегам в списке, используя LINQ - PullRequest
1 голос
/ 31 января 2012

У меня есть сервисный метод, который принимает разделенный список тегов и должен возвращать список продуктов, которые назначены всем тегам в этом списке.

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

public List<Product> GetTagProducts(string tags)
{
    //list of parameters
    var tagParams = tags.Split('+').ToList();

    //return all products which belong to ALL tags specified in tagParams list
    return (from pt in _repository.ProductTags
            where tagParams.All(p => p == pt.Tag.Name)
            select pt.Product).Distinct().Take(75).ToList();
}

public class Tag
{
    [Key]
    public int TagId { get; set; }
    public string Name { get; set; }

    public virtual List<Product> Products { get; set; }
    public virtual List<ProductTag> ProductTags { get; set; }

}

public class Product
{
    public int ProductId { get; set; }
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }
    [Required]
    [Display(Name = "Short Description")]
    public string ShortDescription { get; set; }
    [Required]
    [Display(Name = "Long Description")]
    public string LongDescription { get; set; }
    [Required]
    [Display(Name = "Price")]
    public decimal Price { get; set; }

    public virtual List<Tag> Tags { get; set; }
}

public class ProductTag
{
    [Key]
    public int ProductTagId { get; set; }
    [ForeignKey("Product")]
    public int ProductId { get; set; }
    [ForeignKey("Tag")]
    public int TagId { get; set; }

    public virtual Product Product { get; set; }
    public virtual Tag Tag { get; set; }
}

//Repository
private DatabaseContext _context = new DatabaseContext();
public IQueryable<ProductTag> ProductTags
    {
        get { return _context.ProductTags; }
    }

РЕДАКТИРОВАТЬ : чтобы уточнить результат, который я ищу.Допустим, что tagParams содержит две строки тегов (то есть, я ищу продукты, помеченные ОБА из них):

Automotive
General

И скажем, у нас есть следующие продукты:

product             tags
-------             ----
Wipers              Automotive, General
Air Freshener       General
Gloves              General
Tires               Automotive
Mirror              Automotive, General

Запросдолжны вернуть "дворники" и "зеркало".

1 Ответ

1 голос
/ 31 января 2012

Метод цепочки стилей:

List<Product> allProducts = GetAllProductsFromSomewhere();
allProducts.Where(p => tagParams.All(tag => 
p.Tags.Select(x => x.Name).Contains(tag))).Distinct().Take(75).ToList();

All означает, что все теги должны соответствовать одному тегу. И вы сказали, что он содержит два тега, так что это невозможно.
В MSDN словах:

Определяет, удовлетворяют ли все элементы последовательности условию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...