我在比较实体Framework 4.0中的对象时遇到麻烦。搜寻了一段时间后,我在2008年找到了一篇博客文章,其中指出了我的问题以及发生的原因。 Blog post describing my problem in depth。
总结博客文章,您根本无法与EF框架进行自定义对象比较。例如
public Foo
{
public int ID{get;set;}
public string Name {get;set;}
//I overrode the .Equals AND the == operator
}
public getFoo(Foo target)
{
DC.foos.FirstOrDefault(x => x == target);
}
System.NotSupportedException:无法创建类型为“Foo”的常量值。在此上下文中,仅支持原始类型(例如Int32,String和Guid)。
根据MicroSoft,这是by design。
如果我执行一些魔术接口(interface)或魔术重载,是否有人可以指示我查找是否支持这种对象比较? 非常感谢!
最佳答案
由于EF需要将LINQ语句转换为SQL语句,所以您不能这样做。如果重写的Equals()
方法中具有复杂的比较逻辑,则必须在LINQ语句中重复该比较逻辑。
由于LINQ使用延迟执行,因此您可以将该逻辑封装在返回IQueryable<T>
的方法中,然后将其合并到其他位置。
这是一个例子:
public IQueryable<Foo> FoosEqualTo(IQueryable<Foo> allFoos, Foo target) {
return from foo in allFoos
where foo.Id == target.Id // or other comparison logic...
select foo;
}
public Foo getFoo(Foo target) {
return FoosEqualTo(DC.foos, target).FirstOrDefault();
}
关于c# - Entity Framework 对象比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8435387/