Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在实体框架条件下简化内存对象相等性比较?_C#_Entity Framework_Equality - Fatal编程技术网

C# 如何在实体框架条件下简化内存对象相等性比较?

C# 如何在实体框架条件下简化内存对象相等性比较?,c#,entity-framework,equality,C#,Entity Framework,Equality,如果我通过Entity Framework加载一个对象,并将其持久化以供以后使用(例如在等式筛选器中),Entity Framework将抛出以下错误: 无法创建“MyType”类型的常量值。在此上下文中仅支持基元类型或枚举类型 然后,通过在MyType上使用标识值/值组合,例如。其中(x=>x.Name==MyTypeMemoryInstance.Name),就可以很容易地解决这个问题 但是,我想知道是否有一种替代方法可以允许相等比较,而不必提供原语类型,这样我就可以执行。其中(x=>x==M

如果我通过Entity Framework加载一个对象,并将其持久化以供以后使用(例如在等式筛选器中),Entity Framework将抛出以下错误:

无法创建“MyType”类型的常量值。在此上下文中仅支持基元类型或枚举类型

然后,通过在
MyType
上使用标识值/值组合,例如
。其中(x=>x.Name==MyTypeMemoryInstance.Name)
,就可以很容易地解决这个问题

但是,我想知道是否有一种替代方法可以允许相等比较,而不必提供原语类型,这样我就可以执行
。其中(x=>x==MyTypeMemoryInstance)
,并且仍然在SQL中而不是在内存中执行


从概念上讲,如果我可以为LINQ到SQL的转换提供特定的原语类型比较以用于给定类型,这可以解决,类似于在C#中重写常规相等比较,但我不知道这是否确实可行。谢谢。

问题在于Linq to实体查询被转换为SQL。Linq提供程序无法转换两个对象实例以在sql中进行比较。这就是它抛出该异常的原因,因为它需要像在SQL中一样处理基元类型

一种解决方案是使用
aseneumerable
扩展方法,从Linq到实体再到Linq到对象。如果您执行以下操作:

var query=context.YourDbSet.AsEnumerable().Where(x => x== MyTypeMemoryInstance)....
但是要小心这个解决方案。您将把该表中的所有行加载到内存中。另一个部分解决方案是,如果您有多个条件,则可以先应用一些过滤器,然后在确实需要时应用实例比较:

var query=context.YourDbSet.Where(...).AsEnumerable().Where(x => x== MyTypeMemoryInstance)....

我能想到的最好的方法是,因为在where子句中,Func是:

public class MyType
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Func<MyType, bool> GetQuery()
    {
        // or whatever equals you would like
        return x => x.Name == this.Name && x.Id == this.Id;
    }
}

谢谢-是的,我知道内存中的比较,但我真的想在SQL翻译中实现自动化。本质上,我希望LINQ to SQL提供程序能够知道(通过IComparer、属性等)我要用于相等比较的内容,并在解析相等比较表达式时使用该内容。恐怕无法在服务器级别进行比较:(.但是为什么不能比较两个对象的多个属性而不是比较实例?据我所知,还没有任何东西允许您定义如何在sql中处理/转换要比较的对象实例
var first = ctx.MyTypes.First();
var listContainingLoadedThings = ctx.MyTypes.Where(first.GetQuery()).ToList();