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

时间:2014-01-17 18:29:39

标签: linq nhibernate fluent-nhibernate gethashcode

目前,我正在执行以下操作来检索数据库中存储对象的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子句中再次输入所有字段比较?我发现它太丑了!

非常感谢

2 个答案:

答案 0 :(得分:1)

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

EqualsGetHashCode是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(按用户语言过滤等)。虽然EqualsGetHashCode属于实体(如果可能,但仍属于POCO),并且不应该如此动态

答案 1 :(得分:0)

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