我正在尝试使用Datatable Select,但数据不正确
double marks = 5;
DataRow[] result = dsGrades.Tables[0].Select("Convert(MarksFrom, 'System.Decimal') >=" + marks + " And " + marks + "<= Convert(MarksTo, 'System.Decimal') ");
当“标记”包含“ 5.0”时,我期望MarksFrom = 5.0且MarksTo = 5.9的行,因为5.0处于该范围内,但这里返回5行。
数据表选择有什么问题?任何帮助表示赞赏。
答案 0 :(得分:2)
如果将您的DataColumn类型更改为double
是有意义的,但是即使使用decimal
,您也不需要在表达式内部进行转换。
请注意,在您提供的示例中,约束似乎是向后的。您要指定要MarksFrom
大于或等于,但不会返回所需范围内的单行。
对于任何传入的标记,这应该返回一行:
double marks = 5.0;
DataRow[] result = dsGrades.Tables[0].Select($"{marks} >= MarksFrom AND {marks} <= MarksTo");
此外,由于您总是只期待一场比赛,因此可以将其更改为:
DataRow match = table.Select($"{marks} >= MarksFrom AND {marks} <= MarksTo").SingleOrDefault();
如果返回多个结果, SingleOrDefault
将抛出InvalidOperationException
,在这种情况下可能是期望的结果。
答案 1 :(得分:1)
您可以这样做:
double marks = 5.0;
decimal newMarks = Convert.ToDecimal(marks);
var result =
dsGrades.Tables[0]
.AsEnumerable()
.Where( dr => dr.Field<decimal>( "MarksFrom" ) >= newMarks
&& dr.Field<decimal>( "MarksTo" ) < newMarks + 1);
这可能是解决方案:
var result = dsGrades.Tables[0].Select("Convert(MarksFrom, 'System.Decimal') >=" + newMarks + " And Convert(MarksTo, 'System.Decimal') < " newMarks + 1);
根据我对解释问题的问题的评论:
获取MarksFrom高于5的所有行将返回表中的前5个可见行,检查这5行的第二个条件,并且每行中的5.0小于或等于MarksTo,因此对于这些行。因此要抓5行
答案 2 :(得分:0)
需要从数据表中进行以下铸造:
DataRow[] drGrdPercntl = dt_GrdPercntil.Select($"{SubjVal} >= Convert(MarksFrom, 'System.Decimal') AND {SubjVal} <= Convert(MarksTo, 'System.Decimal')");