数据表选择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;
这个给我准确的结果,是正确的。
我想你可能遇到了"延迟执行"的问题。
这包含了你的"源"数据
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();