我想创建一个lambda表达式来按集合
查询集合在EF代码优先环境中,我有以下数据对象
我有一个名为price的课程
public class Price
{
public int Id { get; set; }
public string DisplayName { get; set; }
public double Amount { get; set; }
public bool IsActive { get; set; }
public int ItemId { get; set; }
[ForeignKey("ItemId")]
public virtual Item Item { get; set; }
public ICollection<PriceOption> PriceOptions { get; set; }
}
一个名为
的相关类public class PriceOption
{
public int Id { get; set; }
public int PriceId { get; set; }
[ForeignKey("PriceId")]
public virtual Price Price { get; set; }
public int OptionId { get; set; }
[ForeignKey("OptionId")]
public virtual Option Option { get; set; }
}
我有两个搜索条件
int ItemId
List<int> optionIds
我想创建一个lambda表达式来选择所有与ItemId(easy)相等的价格以及PriceOptions collection包含所有optionIds。
这个想法是这样的,但当然这仅仅是为了展示我想要实现的目标。
List<Price> prices = _priceRepository.FindAll().Where(x => x.ItemId == item.Id && x.PriceOptions.All(y => y.OptionId == optionIds)).ToList();
感谢您的帮助
厄尔
答案 0 :(得分:1)
以下基于Contains
和Count
方法的LINQ查询会产生更简单(因此最终更快)的SQL查询:
var matchCount = optionIds.Count;
var prices = _priceRepository.FindAll()
.Where(p => p.ItemId == ItemId &&
p.PriceOptions.Count(po => optionIds.Contains(po.OptionId)) == matchCount)
.ToList();