2016-02-15 63 views
5

我用,我写了一个方法,使用下面的代码,以获得一个学生申请的WebAPI工作:为什么在使用Guid.Parse()方法时抛出异常?

public Student GetStudent(string studentId) 
    { 
     var student = this.context.Students.FirstOrDefault(x => x.Id == Guid.Parse(studentId)); 
     return student; 
    } 

这里studentId从电话的WebAPI得到。但是,当我试图运行此应用程序,它抛出一个异常,如:

其他信息:LINQ到实体无法识别方法“的System.Guid解析(System.String)”的方法,而且这种方法不能被翻译进入商店表达。

有没有人告诉我为什么会发生这种情况,我该如何解决这个问题?

回答

7

首先,当您使用EntityFramework时,它会尝试将Guid.Parse()方法转换为SQL,但无法执行此操作,因为它无法转换为SQL语句/'存储表达式'。

你应该只移动串解析出店的表达,并在查询中使用它之前解析字符串Guid值。

public Student GetStudent(string studentId) 
    { 
     var stdId = Guid.Parse(studentId); 
     var student = this.context.Students.FirstOrDefault(x => x.Id == stdId); 
     return student; 
    } 
+0

所以,我不能使用任何类型的方法调用的LINQ查询? – coderhunk

+0

您可以使用EF可以转换为SQL的方法。这就是EF/L2SQL的工作原理,将LINQ转换为SQL。 – DevilSuichiro

+0

@ EF支持的@coderhunk方法 – Mainul

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答案同意关于原因的异常:

所有的Firt当您使用的EntityFramework,这将试图转换 的Guid.Parse()方法将SQL和逾期不改正的因为它不能将 转换为SQL语句/'存储表达式'。

0

如前所述here

实体框架试图在SQL端执行你的投影, 那里没有等同于的String.format。使用AsEnumerable()与Linq的那部分 力评价对象

你的情况下试图评估Guid.Parse转化为未在SQL中的SQL查询。

这事我还当我试图原样

var query = db.Table.Where(f=> f.Date == paramDate.Date.AddDays(-1)).ToList(); 
0

操作日期部分更重要的是,我可以补充,而不是string studentId签名,使用Guid studentId因为这是你所需要的反正。这表明,studentId是​​,而不是调用者的string。如果主叫方希望利用返回Student对象,你不希望他这样做string studentid = student.Id。你希望他这样做Guid myStudentId = student.Id

相关问题