实体框架对象比较

gh9*_*gh9 6 c# entity-framework

我在实体框架4.0中比较对象时遇到了麻烦.谷歌搜索了一段时间后,我在2008年发现了一篇博文,其中说明了我的问题是什么以及为什么会发生这个问题.博客文章深入描述了我的问题.

总结一下博客文章,你根本无法与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);
}
Run Code Online (Sandbox Code Playgroud)

System.NotSupportedException:无法创建类型为'Foo'的常量值在此上下文中仅支持基本类型(如Int32,String和Guid').

这是根据MicroSoft 的设计.

如果我做一些神奇的界面或魔术超载,有人能指出我是否支持这种对象比较? 非常感谢你!

Yuc*_*uck 6

由于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();
}
Run Code Online (Sandbox Code Playgroud)