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

时间:2011-01-06 14:58:05

标签: c# linq

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

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,我需要从WarehouseID分配p1.WarehouesID的值。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以使用let statment:

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

答案 1 :(得分:1)

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

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的强制转型,因为预期FirstOrDefault的结果的int会返回0,而不是一个null int?。我已将其转换为int?,以便我们确定结果是否为null

答案 2 :(得分:0)

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

然后只需添加条件:

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

完成所有操作后,只需添加return .ToArray(),然后使用ifs执行查询。

明白了吗?