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;
}