C# DataTable.Select 在单个列上具有多个条件
C# DataTable.Select With multiple conditions on a Single Column
我有一个数据表,我想一次查询一列以检查它是否符合设定的条件,出于某种原因,下面的代码给出了第一列的正确结果,之后结果不正确。
private bool BusinessRulesOne(DataTable dt, DataColumn dc)
{
bool isSatisfied = false;
DataRow[] checkColumn = dt.Select(dc.ColumnName + " " + "in (1,2,3,)");
if (checkColumn.Length != 0)
{
isSatisfied = true;
}
return isSatisfied;
}
在这个方法中,我传递了我正在查询的 DataTable 和我当前关注的 DataColumn。这里需要做的是我想检查此列中的值是否包含值 1,2 和 3。如果是,则 return true。
private bool BusinessRulesTwo(DataTable dt, DataColumn dc)
{
bool isSatisfied = false;
var checkColumn = dt.Select(dc.ColumnName + " " + " = 1");
if (checkColumn.Count() > 3)
{
isSatisfied = true;
}
return isSatisfied;
}
根据另一条规则,我正在检查该列中的 1 的数量是否超过三 (3) 个,如果是 return true。
欢迎任何建议,我对 Linq 不是很了解,但如果它能让生活更轻松,我愿意学习和探索它。
编辑一列中的值
首先你应该知道数据 table 没有实现 IEnumerable 所以要在这里使用 Linq 你应该使用 AsEnumerable:
对于第一条规则:
private bool BusinessRulesOne(DataTable dt, DataColumn dc) { return dt.AsEnumerable().Any(dataRow => !String.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && ( dataRow.Field<int>(dc.ColumnName) == 1 || dataRow.Field<int>(dc.ColumnName) == 2 || dataRow.Field<int>(dc.ColumnName) == 3));}
对于第二条规则:
private bool BusinessRulesTwo(DataTable dt, DataColumn dc) { return dt.AsEnumerable().Where(dataRow => !String.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && ( dataRow.Field<int>(dc.ColumnName) == 1)).Count() > 3 ;}
"if the values on this column consists of the values 1,2 and 3, then return true"
BusinessRulesOne
没有正确表达这个条件。它的工作方式不同:"if column contains at least one value from set, then return true"。它不保证没有其他值。
这里是修改后的反逻辑方法:"if this column contains smth except 1,2 or 3, then return false"
private bool BusinessRulesOne(DataTable dt, DataColumn dc)
{
DataRow[] checkColumn = dt.Select(dc.ColumnName + " not in (1,2,3)");
return checkColumn.Length == 0;
}
我有一个数据表,我想一次查询一列以检查它是否符合设定的条件,出于某种原因,下面的代码给出了第一列的正确结果,之后结果不正确。
private bool BusinessRulesOne(DataTable dt, DataColumn dc)
{
bool isSatisfied = false;
DataRow[] checkColumn = dt.Select(dc.ColumnName + " " + "in (1,2,3,)");
if (checkColumn.Length != 0)
{
isSatisfied = true;
}
return isSatisfied;
}
在这个方法中,我传递了我正在查询的 DataTable 和我当前关注的 DataColumn。这里需要做的是我想检查此列中的值是否包含值 1,2 和 3。如果是,则 return true。
private bool BusinessRulesTwo(DataTable dt, DataColumn dc)
{
bool isSatisfied = false;
var checkColumn = dt.Select(dc.ColumnName + " " + " = 1");
if (checkColumn.Count() > 3)
{
isSatisfied = true;
}
return isSatisfied;
}
根据另一条规则,我正在检查该列中的 1 的数量是否超过三 (3) 个,如果是 return true。
欢迎任何建议,我对 Linq 不是很了解,但如果它能让生活更轻松,我愿意学习和探索它。
编辑一列中的值
首先你应该知道数据 table 没有实现 IEnumerable 所以要在这里使用 Linq 你应该使用 AsEnumerable: 对于第一条规则:
private bool BusinessRulesOne(DataTable dt, DataColumn dc) { return dt.AsEnumerable().Any(dataRow => !String.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && ( dataRow.Field<int>(dc.ColumnName) == 1 || dataRow.Field<int>(dc.ColumnName) == 2 || dataRow.Field<int>(dc.ColumnName) == 3));}
对于第二条规则:
private bool BusinessRulesTwo(DataTable dt, DataColumn dc) { return dt.AsEnumerable().Where(dataRow => !String.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && ( dataRow.Field<int>(dc.ColumnName) == 1)).Count() > 3 ;}
"if the values on this column consists of the values 1,2 and 3, then return true"
BusinessRulesOne
没有正确表达这个条件。它的工作方式不同:"if column contains at least one value from set, then return true"。它不保证没有其他值。
这里是修改后的反逻辑方法:"if this column contains smth except 1,2 or 3, then return false"
private bool BusinessRulesOne(DataTable dt, DataColumn dc)
{
DataRow[] checkColumn = dt.Select(dc.ColumnName + " not in (1,2,3)");
return checkColumn.Length == 0;
}