我有一個物件,我需要從第一個匹配的欄位中獲取一些欄位。關鍵是“價格”將按“基礎”升序或降序排序。找到第一個匹配的“base”并確保“availability.amount”符合條件,然后最終回傳“base”、“priceTypeID”和“priceLevelID”。這是代碼的簡短片段,它沒有給我我需要的東西;基本上,一個結果給了我 3 場比賽,而另一個沒有給我“priceLevelID”。
我下面的標準應該回傳“base”=4000、“priceTypeID”=“45082”和“priceLevelID”=“2650”
public class PriceInfo
{
public class Availability
{
public int amount { get; set; }
}
public class Price
{
public int @base { get; set; }
public string priceTypeID { get; set; }
}
public class PriceLevel
{
public string priceLevelID { get; set; }
public Availability availability { get; set; }
public List<Price> prices { get; set; }
}
public class ZonePrice
{
public List<PriceLevel> priceLevels { get; set; }
}
public class OfferPrice
{
public List<ZonePrice> zonePrices { get; set; }
}
public class RootObject
{
public List<OfferPrice> offerPrices { get; set; }
}
}
class Program
{
static void Main(string[] args)
{
var json = @"{
""offerPrices"": [
{
""zonePrices"": [
{
""priceLevels"": [
{
""priceLevelID"": ""1653"",
""availability"": {
""amount"": 296
},
""prices"": [
{
""base"": 2000,
""priceTypeID"": ""45082""
}
]
},
{
""priceLevelID"": ""1029"",
""availability"": {
""amount"": 300
},
""prices"": [
{
""base"": 3000,
""priceTypeID"": ""45082""
}
]
},
{
""priceLevelID"": ""2650"",
""availability"": {
""amount"": 400
},
""prices"": [
{
""base"": 4000,
""priceTypeID"": ""45082""
}
]
}
]
}
]
}
]
}";
var obj = JsonConvert.DeserializeObject<PriceInfo.RootObject>(json);
var queryResult1 = obj.offerPrices[0].zonePrices[0].priceLevels.Where(w => w.availability.amount >= 2 &&
w.prices.OrderByDescending(o => o.@base).Any(w2 => w2.@base > 1000 && w2.@base < 300000)).FirstOrDefault();
var queryResult2 = obj.offerPrices[0].zonePrices[0].priceLevels.Select(o => new { o.prices, o.priceLevelID, o.availability.amount }).
Select(o2 => o2.prices.OrderByDescending(o3 => o3).Where(w => w.@base > 1000 && w.@base < 300000).
Select(s => new { o2.priceLevelID, s.priceTypeID, s.@base, o2.amount }).First()).
Where(w2 => w2.amount > 2).First();
uj5u.com熱心網友回復:
在我看來,你要求這個:
var query =
from x in obj.offerPrices[0].zonePrices[0].priceLevels
where x.availability.amount > 2
from y in x.prices
where y.@base > 1000
where y.@base < 300000
orderby y.@base descending
select new { x.priceLevelID, y.priceTypeID, y.@base, x.availability.amount };
var result = query.FirstOrDefault();
這給了我:

var query =
obj
.offerPrices[0]
.zonePrices[0]
.priceLevels
.Where(x => x.availability.amount > 2)
.SelectMany(x =>
x
.prices
.Where(y => y.@base > 1000)
.Where(y => y.@base < 300000)
.OrderByDescending(y => y.@base),
(x, y) => new { x.priceLevelID, y.priceTypeID, y.@base, x.availability.amount });
uj5u.com熱心網友回復:
我不清楚您的選擇標準是什么,但這是我對這個查詢的看法。
首先,選擇葉節點,因為您基于它們進行過濾。在這里,我根據您的示例查詢對排序做出假設:
var ordered = obj.offerPrices
.SelectMany(o => o.zonePrices)
.SelectMany(z => z.priceLevels)
.Select(l => new
{
comparisonPrice = l.prices.MaxBy(p => p.@base).First(), // MaxBy from morelinq. Requires First() because there can be multiple equal base prices
l.priceLevelID,
l.availability
})
.OrderByDescending(l => l.comparisonPrice.@base);
接下來,過濾到所需價格范圍內的結果:
var minBase = 1000;
var maxBase = 300000;
var meetsPriceRange = ordered
.Where(o => o.comparisonPrice.@base > minBase &&
o.comparisonPrice.@base < maxBase);
最后,確保所需的最低可用性并選擇我們的獲勝者:
var minAvailable = 2;
var meetsMinimumAmount = ordered
.Where(o => o.availability.amount >= minAvailable)
.Select(o => new {
o.comparisonPrice.@base,
o.comparisonPrice.priceTypeID,
o.priceLevelID
})
.First();
輸出:
base: 4000
priceTypeId: 45082
priceLevelID: 2650
uj5u.com熱心網友回復:
試試這個
var basePriceItem = obj.offerPrices.SelectMany(o => o.zonePrices)
.SelectMany(z => z.priceLevels).SelectMany(s => s.prices).OrderByDescending(o => o.@base)
.FirstOrDefault(b => b.@base > 1000 && b.@base < 300000);
var item = obj.offerPrices.SelectMany(o => o.zonePrices)
.SelectMany(z => z.priceLevels)
.FirstOrDefault(o => o.prices.Any(p => p.priceTypeID == basePriceItem.priceTypeID && p.@base == basePriceItem.@base));
輸出
{
"priceLevelID": "2650",
"availability": {
"amount": 400
},
"prices": [
{
"base": 4000,
"priceTypeID": "45082"
}
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417520.html
標籤:
