将此代码转换为LINQ?

时间:2011-08-25 14:25:49

标签: c# .net linq

对不起,我刚刚学习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]”

怎么了?

3 个答案:

答案 0 :(得分:4)

不,这是不可能的。正如评论者指出的那样,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);

答案 1 :(得分:1)

尝试以下方法:

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");

答案 2 :(得分:0)

您不应该使用Linq本身,但是您应该使用与linq一起引入的DatasetExtensions,以类型安全的方式从DataRow获取列,而无需转换它们,即

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