我在比较实体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/

10-17 01:51