我有一个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有所了解,但如果让生活更轻松,我愿意学习和探索它。
答案 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;
}