使用LINQ返回属于列表中所有标记的产品

时间:2012-01-31 05:30:22

标签: asp.net-mvc-3 entity-framework linq-to-entities

我有一个服务方法,它接受一个分隔的标签列表,并且应该返回分配给该列表中所有标签的产品列表。

这就是我所拥有的,它不会返回任何产品。我已经仔细检查了数据,有一个属于两个标签的产品。

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

查询应返回&#34; Wipers&#34;和#34;镜子&#34;。

1 个答案:

答案 0 :(得分:1)

方法链样式:

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

All表示所有标记都应该等于一个标记。你说它包含两个标签,所以这是不可能的 在MSDN字中:

  

确定序列的所有元素是否满足条件。