Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据条件从数据表中选择行_C# - Fatal编程技术网

C# 根据条件从数据表中选择行

C# 根据条件从数据表中选择行,c#,C#,我试图使用Datatable Select,但得到的数据不正确 double marks = 5; DataRow[] result = dsGrades.Tables[0].Select("Convert(MarksFrom, 'System.Decimal') >=" + marks + " And " + marks + "<= Convert(MarksTo, 'System.Decimal') "); 双标记=5; DataRow[]result=dsGrades.

我试图使用Datatable Select,但得到的数据不正确

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

DataRow[]result=dsGrades.Tables[0]。如果将数据列类型更改为
double
,则选择(“Convert(MarksFrom,'System.Decimal')>=“+marks+”和“+marks+”,但是即使使用
Decimal
,也不需要在表达式中进行转换

注意:在您提供的示例中,您的约束似乎是向后的。您正在指定希望
MarksFrom
大于或等于传入的金额,这将不会返回所需范围内的任何一行

这将为传入的任何标记返回一行:

double marks = 5.0; 
DataRow[] result = dsGrades.Tables[0].Select($"{marks} >= MarksFrom AND {marks} <= MarksTo");
双标记=5.0;

DataRow[]result=dsGrades.Tables[0]。选择($”{marks}>=MarksFrom和{marks}=MarksFrom和{marks}您可以这样做:

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);
双标记=5.0;
十进制新标记=转换为十进制(标记);
var结果=
表[0]
.可计算的()
其中(dr=>dr.Field(“MarksFrom”)>=newMarks
&&菲尔德博士(“MarksTo”)
这可能是解决方案:

var result = dsGrades.Tables[0].Select("Convert(MarksFrom, 'System.Decimal') >=" + newMarks + " And Convert(MarksTo, 'System.Decimal') < " newMarks + 1);
var result=dsGrades.Tables[0]。选择(“Convert(MarksFrom,'System.Decimal')>=“+newMarks+”和Convert(MarksTo,'System.Decimal')<”newMarks+1);
根据我对问题解释问题的评论:

获取MarksFrom大于5的所有行将返回表中的前5个可见行,检查这5行的第二个条件,并且5.0小于或等于每一行中的MarksTo,以便对这些行计算为true。因此,获取5行需要从datatable执行强制转换,如下所示:


DataRow[]drGrdPercntl=dt\u GrdPercntil。选择($“{subval}>=Convert(MarksFrom,'System.Decimal')和{subval}
marks from
MarksTo
列的数据类型是什么?这些是小数
double
,如果您能够更改
DataTable
模式,那么它们可能是评分精度的最佳选择。
decimal
是货币的更好选择。请检查我的答案-获取MarksF所在的所有行rom大于5将返回表中的前5个可见行,检查这5行的第二个条件,并且5.0小于或等于每行中的MarksTo,因此这将对这些行求值为true。因此,获取5行提供不同的方法并不能解释问题,也不能保证有效。请注意,列
decimal
用于使用可计算的
更改
仍然需要将变量强制转换为
十进制
,以便比较运算符工作。列的数据类型是什么?是的,现在您已将
标记
更改为
十进制
,这将起作用。但是OP的原始帖子指出这是一个问题<代码>双精度
var result = dsGrades.Tables[0].Select("Convert(MarksFrom, 'System.Decimal') >=" + newMarks + " And Convert(MarksTo, 'System.Decimal') < " newMarks + 1);
   DataRow[] drGrdPercntl = dt_GrdPercntil.Select($"{SubjVal} >= Convert(MarksFrom, 'System.Decimal') AND {SubjVal} <= Convert(MarksTo, 'System.Decimal')");