数据表选择linq查询同一列,两个不同的条件导致零行

本文关键字:条件 零行 两个 查询 linq 选择 数据表 一列 | 更新日期: 2023-09-27 18:14:53

IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                              select myRow;
IEnumerable<DataRow> rows;
rows = from myRow in mergedRows where  
double.Parse(myRow["signalName"].ToString())> 1800 &&
                                       select myRow;
mergedRows = rows;
IEnumerable<DataRow> rows;//reinitializing 
rows = from myRow in mergedRows where
double.Parse(myRow["signalName"].ToString()) < 2400
                                       select myRow;
上面的

给我零结果,这是错误的…当查询第二次运行时,mergedRows在第一个条件之后得到结果数据。在第二次查询执行后,我仍然没有得到结果。

但是同样的查询如果有组合条件也可以。

IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                              select myRow;
IEnumerable<DataRow> rows;
rows = from myRow in mergedRows  where 
double.Parse(myRow[signalName].ToString()) > 1800 &&
double.Parse(myRow[signalName].ToString()) < 2400
                                       select myRow;

这个给我准确的结果,是正确的。

数据表选择linq查询同一列,两个不同的条件导致零行

我想你可能遇到了"延迟执行"的问题。

这包含了你的"源"数据

 IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                          select myRow;

这包含了你的查询,但实际上还没有执行。

IEnumerable<DataRow> rows = from myRow in mergedRows where  
                            double.Parse(myRow["signalName"].ToString())> 1800 
                            select myRow;

然后用未执行的查询覆盖源数据

mergedRows = rows;

您可以尝试通过将查询包装在.ToList();

中来贪婪地执行查询
IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                              select myRow;
var rows = (from myRow in mergedRows where  
            double.Parse(myRow["signalName"].ToString())> 1800 &&
            select myRow).ToList();
mergedRows = rows;

rows = (from myRow in mergedRows where
        double.Parse(myRow["signalName"].ToString()) < 2400
        select myRow).ToList();

如果你总是要执行两个过滤器,我会考虑清理整个东西,把你所有的工作合并到一个查询中。

private double SafeParse(string s)
{
    double d;
    return double.TryParse(s, out d) ? d : 0; //return zero if the value is unparsable
}

var results = (from myRow in _gridData.AsEnumerable()
              let d = SafeParse(myRow[signalName].ToString()) 
              where d > 1800 && d < 2400
              select myRow).ToList();