簡體   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