目前,我正在执行以下操作来检索数据库中存储对象的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子句中再次输入所有字段比较?我发现它太丑了!
非常感谢
答案 0 :(得分:1)
答案非常简单明了:这些是不同的概念。
Equals
和GetHashCode
是C#(应用程序,商家)如何在运行时区分对象的方式。它是运算符和计算值 ......两者都不保持不变。
NHibernate不知道在数据库级别应该比较什么。
但上面的代码段中更有趣的是这部分:
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;
}
不会使您的代码变脏。实际上,此方法可以在数据层上。因此,它可以有更多的setings(按用户语言过滤等)。虽然Equals
和GetHashCode
属于实体(如果可能,但仍属于POCO),并且不应该如此动态。
答案 1 :(得分:0)
您不能使用Equals方法,因为Linq无法在sql查询中为您的对象翻译它。