我有两张桌子 - 产品和SKU,一对多相关。
我有第三张桌子,租借,其中包含已租用的sku ID。
产品有许多相关的SKU - 例如产品1可能有sku 1,2和3。
客户通过SKU租赁产品。因此,SKU 1可能没有库存,但库存中仍有2个SKU,这意味着该产品仍然可用。
如果租用了所有3个SKU(在租赁表中),则该产品不可用。
我需要查询库存中剩余SKU的产品的上下文。
我尝试通过获取产品列表,不可用SKU列表以及返回SKU不在不可用SKU列表中的产品来实现此目的。
我有一个iQueryable产品......
IQueryable<products> p = (from r in db.products from pc in r.productcategories
where pc.categories.categoryname == n select r)
.OrderByDescending(s => s.productname).Take(18);
以及不可用的skus列表...
List<int> rentedskus = new List<int>();
rental = rental.Where(t => sd < t.enddate && t.startdate < ed);
foreach (var r in rental)
{
rentedskus.Add(r.skuid);
}
事情变得草率,但我从产品清单中得到了产品skus列表...
List<products> plist = p.ToList();
List<int> productskus = new List<int>();
foreach(var pr in plist)
{
foreach(var sk in pr.sku)
{
productskus.Add(sk.skuid);
}
}
现在,假设这是实现我的目标的可接受方式,我只需要选择那些相关SKU不在letedskus中的产品。我尝试了一些......的变种。
var productlistresult = productskus.Except(rentedskus).ToList();
p = p.Where(i => i.productlistresult.Contains(product.skus(n => n.skuid));
答案 0 :(得分:1)
你最近的示例代码几乎就是那里,你只是有一些逻辑错误。这就是你需要的:
p = p.Where(i => productlistresult.Contains(i.skuid));
此外,您可以使用Select
大幅清理代码。例如,不是创建列表,查询租用的skus,然后迭代skus并将它们添加到列表中,只需执行以下操作:
var rentedskus = rental.Where(t => sd < t.enddate && t.startdate < ed).Select(t => t.skuid);