根据条件从DataTable中选择行

时间:2018-09-01 13:18:02

标签: c#

我正在尝试使用Datatable Select,但数据不正确

 double marks = 5; 
 DataRow[] result = dsGrades.Tables[0].Select("Convert(MarksFrom, 'System.Decimal') >=" + marks + " And " + marks + "<= Convert(MarksTo, 'System.Decimal') ");

dsGrades包含以下数据, enter image description here

当“标记”包含“ 5.0”时,我期望MarksFrom = 5.0且MarksTo = 5.9的行,因为5.0处于该范围内,但这里返回5行。

数据表选择有什么问题?任何帮助表示赞赏。

3 个答案:

答案 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')");