C#DataTable.Select单列上有多个条件

时间:2017-03-20 04:14:24

标签: c# .net linq datatable datacolumn

我有一个DataTable,我想一次查询一列以检查它是否符合设定的标准,由于某种原因,下面的代码在结果不正确之后为第一列提供了正确的结果。

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 I&m; mering和DataColumn。这里需要做的是我想检查此列上的值是否包含值1,2和3.如果是,则返回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' s)的数量是否超过三(3)。

欢迎提出任何建议,我不会对Linq有所了解,但如果让生活更轻松,我愿意学习和探索它。

使用一列中的值进行编辑 enter image description here

2 个答案:

答案 0 :(得分:1)

首先你应该知道数据表没有实现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 ;}

答案 1 :(得分:1)

“如果此列上的值包含值1,2和3,则返回true”

BusinessRulesOne没有正确表达这种情况。它的工作方式不同:“如果列包含至少一个来自set的值,则返回true”。它不保证没有其他值。

这里是带有反向逻辑的修改方法:“如果此列包含除1,2或3之外的smth,则返回false”

private bool BusinessRulesOne(DataTable dt, DataColumn dc)
{
    DataRow[] checkColumn = dt.Select(dc.ColumnName + " not in (1,2,3)");

    return checkColumn.Length == 0;
}