实体框架- lambda表达式中的NotSupportedException

本文关键字:NotSupportedException 表达式 lambda 框架 实体 | 更新日期: 2023-09-27 18:18:09

在我的MVC应用程序ApplicationUserEmployee类有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)));

我在这里错过了什么?为什么会出现这个错误?

谢谢!

实体框架- lambda表达式中的NotSupportedException

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表达式可以合二为一以提高效率

相关文章:
  • 没有找到相关文章