实体框架 - NotSupportedException异常的lambda表达式(Entity f

2019-10-20 17:56发布

在我的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)));

什么我在这里失踪? 为什么我得到这个错误?

谢谢!

Answer 1:

GetCurrentApplicationUser方法不能转换成SQL。 如果你想使用你的查询自定义的方法,你必须将记录加载到内存中(例如,使用AsEnumerable()然后做你想做的。

你可能会想,该方法只是执行另一个查询并返回结果,所以它应该被翻译成SQL但可以在你的方法,几乎任何东西,也不能保证的话, 支持

欲了解更多信息,请参阅支持和不支持LINQ方法(LINQ到实体)



Answer 2:

试试你的功能评价一个员工第一...

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表达式可以被放入一个以使其更有效率。



文章来源: Entity framework - NotSupportedException in lambda expression