为什么在使用Guid.Parse()方法时抛出异常?

时间:2016-02-15 06:36:08

标签: c# entity-framework linq asp.net-web-api

我正在使用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)'方法,并且此方法无法转换为商店表达式。

有没有人告诉我为什么会这样,我该如何解决这个问题呢?

4 个答案:

答案 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