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

时间:2014-08-16 07:32:31

标签: c# linq linq-to-entities asp.net-mvc-5 entity-framework-6

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

我在这里缺少什么? 为什么我收到这个错误?

谢谢!

2 个答案:

答案 0 :(得分:1)

GetCurrentApplicationUser方法无法转换为SQL。如果您想在查询中使用自定义方法,则必须将记录加载到内存中(例如使用AsEnumerable())然后执行任何操作。

您可能认为该方法只是执行另一个查询并返回结果,因此它应该被转换为SQL但是您的方法中几乎可以有任何东西,所以不能保证,它是< EM>不受支持

有关详细信息,请参阅Supported and Unsupported LINQ Methods (LINQ to Entities)

答案 1 :(得分:0)

首先尝试将您的功能评估为员工......

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表达式放在一起以使其更有效。