我有一个服务方法,它接受一个分隔的标签列表,并且应该返回分配给该列表中所有标签的产品列表。
这就是我所拥有的,它不会返回任何产品。我已经仔细检查了数据,有一个属于两个标签的产品。
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;。
答案 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字中:
确定序列的所有元素是否满足条件。