获取其fk相关实体在id列表中不包含id的实体列表

本文关键字:id 实体 列表 包含 fk 获取 | 更新日期: 2023-09-27 18:16:01

我有两个表-产品和sku,一个关联多个。

我有第三个表rental,其中包含已租用的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不在rentedskus中的产品。

var productlistresult = productskus.Except(rentedskus).ToList();
p = p.Where(i => i.productlistresult.Contains(product.skus(n => n.skuid));

获取其fk相关实体在id列表中不包含id的实体列表

您的上一个示例代码基本都完成了,只是有一些逻辑错误。这就是你需要的:

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);