对不起,我刚刚学习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]”
怎么了?
答案 0 :(得分:4)
不,这是不可能的。正如评论者指出的那样,LINQ用于查询事物的集合。您似乎没有集合:只有if
语句和作业。
此外,小心尝试不必要地将事物转换为LINQ。当您开始更好地理解LINQ时,您会发现自己将其用于各种目的。但首先假设LINQ的代码会更好,这可能是一个谬论。
如前所述,LINQ是关于查询一组结果的集合。如果您只想要一个结果,则可以使用Single
,First
,SingleOrDefault
或FirstOrDefault
将其从结果集合中删除。
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...