实体框架- lambda表达式中的NotSupportedException
本文关键字:NotSupportedException 表达式 lambda 框架 实体 | 更新日期: 2023-09-27 18:18:09
在我的MVC应用程序ApplicationUser和Employee类有1-1关系:
public class ApplicationUser : IdentityUser
{
public Employee Employee { get; set; }
}
public class Employee
{
[Key]
public virtual ApplicationUser ApplicationUser { get; set; }
public virtual string Name { get; set; }
}
在公共静态类
中我有以下方法:
public static ApplicationUser GetCurrentApplicationUser(string userName)
{
using (DbContext db = new DbContext())
{
return db.Users.FirstOrDefault(u => u.UserName.Equals(userName));
}
}
public static Employee GetEmployeeByApplicationUser(string userName)
{
using (DbContext db = new DbContext())
{
return db.Employees.SingleOrDefault(e => e.ApplicationUser == GetCurrentApplicationUser(userName));
}
}
如你所见,第二个方法正在使用第一个方法。但我得到以下错误:
System.NotSupportedException was unhandled by user code
Message=LINQ to Entities does not recognize the method 'GetCurrentApplicationUser(System.String)' method, and this method cannot be translated into a store expression.
但是如果我将第一个方法中的内部代码粘贴到第二个方法中,就像下面这样,它可以正常工作。
return db.Employees.SingleOrDefault(e => e.ApplicationUser == db.Users.FirstOrDefault(u => u.UserName.Equals(userName)));
我在这里错过了什么?为什么会出现这个错误?
谢谢!
GetCurrentApplicationUser
方法不能翻译成SQL。如果你想在查询中使用自定义方法,你必须将记录加载到内存中(例如使用AsEnumerable()
),然后做任何你想做的。
你可能会认为该方法只是执行另一个查询并返回结果,所以它应该被翻译成SQL
,但在你的方法中几乎可以有任何东西,没有保证,所以,它是不支持。
有关更多信息,请参见支持和不支持的LINQ方法(LINQ to Entities)
尝试先将函数求值为Employee…
using (DbContext db = new DbContext())
{
db.Connection.Open();
Employee currentApplicationUser = db.Users.FirstOrDefault(u => u.UserName.Equals(userName));
currentApplicationUserEmployee = db.Employees.SingleOrDefault(e => e.ApplicationUser == currentApplicationUser);
db.Connection.Close();
return currentApplicationUserEmployee;
}
尽管这两个lambda表达式可以合二为一以提高效率