在此上下文中仅支持基本types或枚举types

我在这个主题上看到了很多问题,但是我还没有能够通过其中的任何解决我所看到的问题的方法来sorting。 我有一个活动实体,跟踪哪个员工分配给哪个员工,以及哪个员工创buildlogging并进行更新。 如果我删除`where a.AssignedEmployee == currentUser'代码行,我不会在下面的运行时错误。

无法创buildtypes为“DataModels.Employee”的常量值。 在此上下文中仅支持基本types或枚举types。

CONTROLLER

var query = from a in db.Activities where a.AssignedEmployee == currentUser where a.IsComplete == false orderby a.DueDate select a; return View(query.ToList()); 

视图

 @model IEnumerable<Data.DataModels.Activity> .......... 

我的猜测是,错误表明EF无法将Employee的等于操作符转换为SQL(无论您是假定引用相等还是重写的==运算符)。 假设Employee类具有唯一标识符,请尝试:

 var query = from a in db.Activities where a.AssignedEmployeeId == currentUser.Id where a.IsComplete == false orderby a.DueDate select a; return View(query.ToList()); 

它不喜欢你试图将整个对象平等转换成数据库查询的事实。 您只能使用常量值进行entity framework查询,就像您将如何执行SQL查询一样。 解决这个问题的方法是比较ID,看看AssignedEmployee的ID是否与employee表中的当前用户ID相同。

另外,如果您正在跟踪的当前用户对象不是Employeetypes,则可能需要考虑caching该用户的相应Employeelogging,以便在以后的查询中更好地引用该logging。 这会比尝试不断地经历这个表更好。 (如果是这样的话,这只会影响到你,实际上是在不同的表格中)

使用==和obj.Equals的问题是,entity framework不知道如何将该方法调用转换为SQL,即使将这两种方法重载到可以转换为SQL的东西中。 你可以做什么来解决entity framework中的这个缺点是创build一个方法,返回一个expression式树,进行更复杂的相等性检查你想要做的。

例如,假设我们有以下课程

 public class Person { public string Firstname { get; set; } public string Lastname { get; set; } } 

为了返回entity framework可以理解的自定义相等操作,请将以下方法添加到Person类中:

 public static Expression<Func<Person, bool>> EqualsExpressionTree( Person rhs ) { return ( lhs ) => string.Equals( lhs.Firstname, rhs.Firstname ) && string.Equals( lhs.Lastname, rhs.Lastname ); } 

在你的LINQ查询中,你可以使用你自定义的相等代码,如下所示:

 Person anotherPerson = new Person { Firstname = "John", Lastname = "Doe" } personCont.Where( Person.EqualsExpressionTree(anotherPerson) ); //... if ( personCont.Any( Person.EqualsExpressionTree(anotherPerson)) ) { //... 

此外,EqualsExpressionTree方法可以重写为调用静态Equals方法,使您可以利用自定义的相等逻辑。 然而,在所有的事情中,请记住, 你的代码必须转换成一个SQLexpression式 ,因为毕竟我们调用数据库而不从内存中访问内容。