繁体   English   中英

帮助Linq查询,需要根据子查询的结果设置ID

[英]Help with Linq query, need to set ID based on results of a sub-query

我的链接查询当前看起来像:

var products =
(
    from p in products
    where !p.parentID.HasValue          
    select new ProductList
    {
        Name = p.Name,
        WarehouseID = p.WarehouseID,
        IsInStock = products.Any(p1 => p1 ... )
    }       
).ToArray();

根据业务规则,我需要做的是:

如果IsInStock设置为true ,我需要从p1.WarehouesID分配WarehouseID的值。

我怎样才能做到这一点?

您可以使用let语句:

var products =
  (
   from p in products
   where !p.parentID.HasValue
   let p1Id = products.Where(p1 => p1 ... ).Select(p1 => p1.WarehouseID).FirstOrDefault()
   select new ProductList
   {
    Name = p.Name,
    WarehouseID = p1Id == 0 ? p.WarehouseID : p1Id,
    IsInStock = p1Id != 0
   }


  )
  .ToArray();

不幸的是,这并不像你想的那么简单。 尽管如此,这是一种方法(假设WarehouseID是一个int ):

var products =
(
    from p in products
    where !p.parentID.HasValue

    select new ProductList
    {
        Name = p.Name,
        WarehouseID = (int)(products.Where(p1 => p1 ... ).Select(p1 => (int?)p1.WharehouseID).FirstOrDefault() ?? p.WarehouseID),
        IsInStock = products.Any(p1 => p1 ... )
    }


)
.ToArray();

作为解释,强制转换为int? int是必需的,因为在期望int的结果上返回FirstOrDefault会返回0 ,而不是null int? 我将其转换为int? 这里允许我们确定结果实际上是否为null

不要将.ToArray()放在最后。

然后只需添加条件:

if (IsInStock()) 
 products = products.where(p => p.WarehouseID > 10);
else
 products = products.where(p => p.WarehouseId < 10);

在所有事情之后,只需添加return .ToArray()并使用ifs执行查询。

明白了吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM