我有一个表Assessment
,其中包含两列CurrentGrade
和PreviousGrade
,其中两列都定义为char(1)
。等级是从A到Z的符号。
现在,我想编写一个查询,以获取Assessment
中所有记录的当前成绩与上一年级之间的差异,以表示为数字,例如如果previous是A且current是D,则差值为3.
我会做这样的事情:
var q = db.Assessments.Select(a => new { a.ID, Diff = a.CurrentGrade[0] - a.PreviousGrade[0] });
...除了这不起作用,因为String.getChars
没有SQL翻译。
我不想在本地内存中执行此操作,因为在我的实际代码中,这只是涉及必须在Linq to Entities中执行的其他表达式的大“where”子句的一部分。
有任何建议怎么做?
答案 0 :(得分:3)
在 Linq-To-Entities 中,您可以使用SqlFunctions.Ascii
:
using System.Data.Objects.SqlClient;
var result = db.Assessments.Select(a => new { a.id,
Diff = SqlFunctions.Ascii(a.CurrentGrade).Value - SqlFunctions.Ascii(a.PreviousGrade).Value });
请注意,如果CurrentGrade
高于PreviousGrade
(D),您将获得-3
的答案,这与 相反可能 想......所以你可能想要乘以-1
来得到等级差异的真实方向。
var result = db.Assessments.Select(a => new { a.id,
Diff = (SqlFunctions.Ascii(a.CurrentGrade).Value - SqlFunctions.Ascii(a.PreviousGrade).Value) * -1 });