我正在使用WebApi应用程序,在那里我编写了一个使用以下代码获取学生的方法:
public Student GetStudent(string studentId)
{
var student = this.context.Students.FirstOrDefault(x => x.Id == Guid.Parse(studentId));
return student;
}
这里studentId来自WebApi电话。但是,当我尝试运行此应用程序时,它会抛出一个异常,如:
附加信息:LINQ to Entities无法识别方法'System.Guid Parse(System.String)'方法,并且此方法无法转换为商店表达式。
有没有人告诉我为什么会这样,我该如何解决这个问题呢?
答案 0 :(得分:11)
首先,当您使用EntityFramework
时,它会尝试将Guid.Parse()
方法转换为SQL,但它无法执行此操作,因为它无法转换为SQL语句/'store expression'。< / p>
您应该将字符串解析移出商店表达式,并在查询中使用它之前将字符串解析为Guid
值。
public Student GetStudent(string studentId)
{
var stdId = Guid.Parse(studentId);
var student = this.context.Students.FirstOrDefault(x => x.Id == stdId);
return student;
}
答案 1 :(得分:2)
您可以尝试这种方法:
public Student GetStudent(string studentId)
{
var student = (from c in this.context.Students
let guidId = Guid.Parse(studentId)
where c.Id == guidId
select c).FirstOrDefault();
return student;
}
在这种方法中,let
允许您创建新的临时变量,稍后可能会在LinqToEntities
查询中使用。
我同意@Mainul对异常原因的回答:
当您使用EntityFramework时,这将尝试转换 Guid.Parse()方法到SQL,它无法做到这一点,因为它不能 转换为SQL语句/&#39;存储表达式&#39;。
答案 2 :(得分:0)
如上所述here
实体框架试图在SQL端执行您的投影, 其中没有与string.Format等效的东西。使用AsEnumerable()来 使用Linq to Objects
强制评估该部分
您的案例尝试评估转换为SQL查询的Guid.Parse
,这在SQL中找不到。
当我尝试操作日期部分as-
时,我也发生了这种情况var query = db.Table.Where(f=> f.Date == paramDate.Date.AddDays(-1)).ToList();
答案 3 :(得分:0)
更好的是,我可以添加,而不是string studentId
进行签名,使用Guid studentId
,因为无论如何你都需要它。这清楚表明studentId是guid
,而不是呼叫者的string
。如果调用者想要使用返回的Student
对象,则您不希望他执行此操作string studentid = student.Id
。你希望他这样做Guid myStudentId = student.Id
。