在我的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)));
我在这里缺少什么? 为什么我收到这个错误?
谢谢!
答案 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表达式放在一起以使其更有效。