我有以下类来获取 API 响应:
[JsonObject]
[Serializable]
public class Root
{
public Metadata metadata { get; set; }
public List<Result> result { get; set; }
}
[JsonObject]
[Serializable]
public class GroupRecord
{
public string groupNumber { get; set; }
}
[JsonObject]
[Serializable]
public class Metadata
{
public int totalCount { get; set; }
public int page { get; set; }
public int pageCount { get; set; }
}
[JsonObject]
[Serializable]
public class Npi
{
public DateTime EffectiveDate { get; set; }
}
[JsonObject]
[Serializable]
public class Result
{
public string Name { get; set; }
public Npi npi { get; set; }
public List<GroupRecord> aGroupRecord { get; set; }
}
groupNumber
我正在尝试使用 LINQ 获取与给定匹配且具有最新结果的结果EffectiveDate
。
这是我认为应该可以工作的应用程序代码:
string groupNumber = "SALT"
Root dataObject = response.Content.ReadAsAsync<Root>().Result;
if (dataObject.result.Count >= 1)
{
var result = dataObject.result.Where(x => x.aGroupRecord.Where(a => a.groupNumber == groupNumber).OrderByDescending(x.npi => x.npi.EffectiveDate)).FirstOrDefault();
}
如果输出应该是
Result
,那么你想要:我没有使用
x
参数名称来使参数代表什么更加清楚:r
对于“record”和gr
“groupRecord”。这假设在过滤过程中,您想要保留任何
Record
具有至少一GroupRecord
具有匹配组号的对象。您的代码中出现了一些与 有关的恶作剧
.OrderByDescending(x.npi
。它被附加到x.aGroupRecord
,但它重用了作用域中更高位置的变量。这需要一个产生布尔值的委托,即是否应将特定内容
Result
包含在数据集中。但是您为其提供了完整列表,这是无效的。我猜您想要的是:即包括至少有一个与groupNumber匹配的aGroupRecord的所有结果。
然后,您可以应用排序并取第一个项目,或者您可以使用较新的 MaxBy 函数:
如果您想要具有最高生效日期的GroupRecord ,您可以引入一个元组来将 aGroupRecords 与相关日期一起投影: