我有类似这个模型的东西:
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public ICollection<ProductVariation> Variations { get; set; }
}
public class ProductVariation
{
public int VariationID { get; set; }
public string Size { get; set; }
public bool InStock { get; set; }
}
我有一个产品清单 - 名为“availableProducts”
List<Product> availableProducts;
然后我还有一个int - requestedVariationNumbers列表:
List<int> requestedVariationNumbers;
我要做的是从 availableProducts 获取产品,其中Product.Variations集合包含 requestedVariationNumbers 中的 VariationID 。
到目前为止,我有这个: (由ReSharper根据一系列丑陋的foreach语句生成......)
这对我来说似乎“肮脏”......
var result = (
from rvn in requestedVariationNumbers
from product in availableProducts
from itemVariation in product.ItemVariations
where itemVariation.ItemNo == rvn
select product)
.ToList();
答案 0 :(得分:5)
试试这个:
var result = availableProducts.Where(p => p.Variations
.Any(v => requestedVariationNumbers
.Contains(v.VariationID)));
这不是很有效。如果requestedVariationNumbers
为HashSet
会更好,因为在最坏的情况下,每个产品的每个变体都会调用requestedVariationNumbers.Contains(v.VariationID)
,而在最佳情况下,每个产品的每个变体都会调用{{1}}。
答案 1 :(得分:1)
使用Intersect
的方法:
var result =
from product in availableProducts
let variationIds = from v in product.Variations select v.VariationID
where variationIds.Intersect(requestedVariationNumbers).Any()
select product;
您可以ToList()
,result
这里IEnumerable<Product>
。