使用Where子句中的Equal/GetHashCode从DB检索Id



当前我正在执行以下操作来检索数据库中存储的对象的ID,该对象与实体MyObject 的某些字段匹配

MyObject contract = new MyObject( some parameters );
Session.Query<MyObject>().Where( x=>x.Field1==contract.Field1 && x.Field2==contract.Field2 .... ).FirstOrDefault();

我想要的是从Equal和GetHashCode被否决的事实中获利:

Session.Query<MyObject>().Where( x=>x.Equal(contract) ).FirstOrDefault();

但这行不通。有没有什么方法可以避免我在Where子句中再次键入所有字段的比较?我觉得很难看!

非常感谢

答案非常简单明了:这是不同的概念。

EqualsGetHashCode是C#(应用程序、业务)在运行时区分对象的方法。它是运算符计算值。。。两者均而非持续存在。

NHibernate不知道在DB级别上应该比较什么。

但在上面的片段中更有趣的是这一部分:

MyObject contract = new MyObject( some parameters );

某些参数可能意味着两件事:1)标识符或2)动态搜索过滤器。

在第一种情况下,我们应该从代理密钥/id:中获利

Session.Get<MyObject>(id);

在第二种情况下,我们很可能(迟早)会被提供一组不断变化的值。然后我们可以动态地应用它们。

最后,您最有可能搜索的案例是一些GetByCode或GetByName。我想说,像这样的实现方法

public virtual MyObject GetByCode(string code)
{
var result = Session
.Query<MyObject>()
.Where( x => x.Code == code )
.FirstOrDefault();
return result;
}

不会使您的代码变脏。事实上,此方法可以在数据层上。因此,它以后可能会有更多的设置(按用户语言筛选…等等)。而EqualsGetHashCode属于实体(如果可能的话,POCO),不应该是,所以是动态的

您不能使用Equals方法,因为Linq无法在对象的sql查询中转换它。

最新更新