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 的设计.
如果我做一些神奇的界面或魔术超载,有人能指出我是否支持这种对象比较? 非常感谢你!
由于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)