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 - Fatal编程技术网

在c#中是否有比较多个属性的快捷方式?

在c#中是否有比较多个属性的快捷方式?,c#,entity-framework,C#,Entity Framework,我必须检查一个对象的属性是否已更改,但只检查其属性的一部分,而不是全部。如id、创建日期。。。不需要检查 我不知道是否有任何简短的变体来写这个,我不知道 现在,我对每个属性进行简单比较: if (user.first_name != uFirstName || user.last_name != uLastName || user.street != uStreet || user.zip_code != uZipCode || user.city != uCity || use

我必须检查一个对象的属性是否已更改,但只检查其属性的一部分,而不是全部。如id、创建日期。。。不需要检查

我不知道是否有任何简短的变体来写这个,我不知道

现在,我对每个属性进行简单比较:

if (user.first_name != uFirstName || user.last_name != uLastName
    || user.street != uStreet || user.zip_code != uZipCode
    || user.city != uCity || user.country_id != countryAX.id
    || user.email != uEMail || user.phone != uPhone)
    {
        ...
    }

“user”是一个EntityFramework对象

我将重写
user
-类中的
Equals
(++
GetHashCode
)。然后从这些变量创建第二个实例(如果您还没有),您可以编写:
if(user1Info.Equals(user2Info)){…}
。如果您不首先使用代码,并且您的实体是自动生成的,那么您可以创建一个
特殊类用户
,以实现
等于

public partial class User
{
    public override bool Equals(Object obj)
    {
        // implement according to your specifications
    }

    public override int GetHashCode() 
    {
        // implement according to your specifications
    }
}
另一个选项是使用匿名类型,该类型自动覆盖
Equals
+
GetHashCode

var user1Info = new 
{ 
    user.first_name,
    user.last_name,
    user.street, // ...
};
var user2Info = new 
{ 
    first_name = uFirstName,
    last_name = uLastName,
    street = uStreet, // ...
};
if(user1Info.Equals(user2Info))
{

} 

试试这样的东西

public static bool PublicInstancePropertiesEqual<T>(T value, T tobecompared) where T : class 
  {
     if (value!= null && tobecompared!= null)
     {
        Type type = typeof(T);
        foreach (System.Reflection.PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
        {
              object selfValue = type.GetProperty(pi.Name).GetValue(self, null);//Get Current value
              object toValue = getCompareToValue();

              if (selfValue != toValue && (selfValue == null || !selfValue.Equals(toValue)))
              {
                 return false;
              }
        }
        return true;
     }
     return value == tobecompared;
  }
public static bool PublicInstancePropertiesEqual(T值,T要比较),其中T:class
{
if(值!=null&&tobecompared!=null)
{
类型=类型(T);
foreach(type.GetProperties中的System.Reflection.PropertyInfo pi(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
object selfValue=type.GetProperty(pi.Name).GetValue(self,null);//获取当前值
object toValue=getCompareToValue();
if(selfValue!=toValue&(selfValue==null | | |!selfValue.Equals(toValue)))
{
返回false;
}
}
返回true;
}
返回值==待比较;
}

一种
等于
的方法?通常情况下,它仍然会执行相同的操作,但是您可以重用它。您可以将您的问题视为的重复,它询问如何比较两个EF实体。EF将表达式转换为SQL。在SQL中,无法同时比较多个字段。您试图解决的实际问题是什么?这与并发性有关吗?EF本身将检查属性或任何rowversion字段的更改,以确保对象没有更改。或者,如果新附加的对象没有更改,您是否试图避免保存这些对象?如果您希望仅基于几个属性的值执行乐观并发,则可以将该属性添加到属性中。事实上,如果希望所有属性都参与并发检查,则必须将该属性添加到所有属性。问题已经解决,使用my script=>Check检查是否需要更新我的DataRow;我主要是想,也许有一个很酷的速记来写这个OP想要使用属性的子集,而不是全部。正确的,我不能创建第二个对象,因为这总是不同的,因此我不能复制创建日期。是的,这对我来说很明显,但我没有两个实体对象,但是一个实体对象和许多单个属性并不代表完整的实体对象