首页 > 解决方案 > 编写 linq 查询以获取满足条件的记录

问题描述

我需要编写一个 linq 查询以从索引文件中获取所有记录(CompRecordPosition == 0 and DPNbr!=0) || (CompRecordPosition!=0)。我已经编写了如下查询,但调试器卡在这一行而没有进一步处理。请帮助仅将那些索引记录获取到_wIndex满足给定条件的变量

private List<WIndex> _wIndex;
private readonly string _FilePath;
internal const string _Key = "Test";

string idxData = File.ReadAllText(Path.Combine(_FilePath, _Key + ".ind"));
_wIndex = JsonConvert.DeserializeObject<List<WIndex>>(idxData);

_wIndex = _wIndex.Where(p2=>_wIndex
    .Any(p1 => (p2.CompletionRecordPosition == 0  && p2.WbNewestDrlPmtNbr!=0) || 
    p2.CompletionRecordPosition!=0)).ToList();

WIndex 类

public class WIndex
{
    public string BaNo;
    public long RecordPosition;
    public long CompRecordPosition;
    public long SegRecordPosition;
    public string DataType;
    public int RecordIndex;
    public Int32 DpNbr;
}

索引文件

  [{
    "BaNo": "7000650000",
    "RecordPosition": 345,
    "CompRecordPosition": 567,
    "SegRecordPosition": 788,
    "DataType": "WELL",
    "RecordIndex": 0,
    "DPNbr": 0
  },
  {
    "BaNo": "7000790001",
    "RecordPosition": 800,
    "CompRecordPosition": 0,
    "SegRecordPosition": 0,
    "DataType": "WELL",
    "RecordIndex": 1,
    "DPNbr": 810
  }]

标签: c#jsonlinqindexingjson-deserialization

解决方案


您尝试执行的 linq 语句中提出了一些问题:

为什么在 where 子句中where立即使用then 子句。any我的建议是删除 any 子句,因为它不需要从列表中收集您请求的项目。

Any()- 确定序列的元素是否存在或是否满足条件。

Where()- 根据谓词过滤一系列值。

做出类似的声明_wIndex.Where(x => x.CompletionRecordPosition == 0 && x.WbNewestDrlPmtNbr != 0).ToList();可能会更可取。

此外,.Any(p1 => ...这里p1永远不会在任何 lambda 表达式中使用或指示。可以作为集合之间的input parameter关系被删除,p1并且p2永远不会在集合之间关联。最有可能导致调试停止并试图确定需要什么。

让我知道这是否有帮助 - 谢谢。


推荐阅读