将此代码转换为LINQ

本文关键字:LINQ 转换 代码 | 更新日期: 2023-09-27 18:06:43

对不起,我刚刚学习LINQ,对它比较陌生。

是否可以将以下代码转换成LINQ?

foreach (DataRow gradeCount in GraceTable.Rows)
{
    if (Convert.ToDecimal(obtMarksRow["Percentage"]) >= 
        (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) &&
        (Convert.ToDecimal(obtMarksRow["Percentage"]) <= 
        Convert.ToDecimal(gradeCount["EXG_MARKS_BELOW"])))
    {
        string Grade = Convert.ToString(gradeCount["EXG_GRADE_NAME"]);
    }
}

编辑:抱歉,我错过了ma查询中的每个循环,obtMarksRow来自于这个

之外的另一个循环

我写了这样的查询

     var gradeValue = from DataRow gradeRow in GraceTable.Rows
                                 let marksAbove = gradeRow.Field<decimal>("EXG_MARKS_ABOVE") 
                                 let marksBelow = gradeRow.Field<decimal>("EXG_MARKS_BELOW")
                                 where obtMarksRow.Field<decimal>("Percentage") >= marksAbove && obtMarksRow.Field<decimal>("Percentage") <= marksBelow
                                 select gradeRow.Field<string>("EXG_GRADE_NAME");

但我得到的值(gradeValue.ToString())为"System.Linq.Enumerable+WhereSelectEnumerableIterator ' 2[System.Data.DataRow,System.String]"

将此代码转换为LINQ

不,不可能。正如评论者指出的那样,LINQ是用于查询事物集合的。这里似乎没有一个集合:只有一个if语句和一个赋值。

此外,在尝试将不必要的东西转换为LINQ时要小心。当您开始更好地理解LINQ时,您会发现自己很自然地将它用于各种目的。但是一开始就假设使用LINQ代码会更好,这可能是一个谬论。

编辑

如前所述,LINQ是关于查询一个集合的一组结果。如果您只想要一个结果,您可以使用SingleFirstSingleOrDefaultFirstOrDefault将其从结果集合中取出。

 var gradeValues = from DataRow gradeRow in GraceTable.Rows
                             let marksAbove = gradeRow.Field<decimal>("EXG_MARKS_ABOVE") 
                             let marksBelow = gradeRow.Field<decimal>("EXG_MARKS_BELOW")
                             where obtMarksRow.Field<decimal>("Percentage") >= marksAbove && obtMarksRow.Field<decimal>("Percentage") <= marksBelow
                             select gradeRow.Field<string>("EXG_GRADE_NAME");
var firstGradeValue = gradeValues.First(); // will throw exception if there were no matches.
Console.WriteLine(firstGradeValue);

尝试如下:

var grades = from r in GraceTables.Rows
             where obtMarksRow.Field<decimal>("Percentage") >= 
                     r.Field<decimal>("EXG_MARKS_ABOVE") && 
                   obtMarksRow.Field<decimal>("Percentage") <= 
                     r.Field<decimal>("EXG_MARKS_BELOW")
             select r.Field<string>("EXG_GRADE_NAME");

你不应该使用Linq本身,但你应该使用与Linq一起带来的DatasetExtensions,以类型安全的方式从DataRow获取列,而不需要转换它们,即

if (obtMarksRow.Field<decimal>("Percentage") >= (Convert.ToDecimal(gradeCount["EXG_MARKS_ABOVE"])) && etc...