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

Linq 在Where子句中使用Equal/GetHashCode从DB检索Id,linq,nhibernate,fluent-nhibernate,gethashcode,Linq,Nhibernate,Fluent Nhibernate,Gethashcode,目前,我正在执行以下操作来检索数据库中与实体MyObject的某些字段匹配的存储对象的ID MyObject contract = new MyObject( some parameters ); Session.Query<MyObject>().Where( x=>x.Field1==contract.Field1 && x.Field2==contract.Field2 .... ).FirstOrDefault(); MyObject contrac

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

MyObject contract = new MyObject( some parameters );

Session.Query<MyObject>().Where( x=>x.Field1==contract.Field1 && x.Field2==contract.Field2 .... ).FirstOrDefault();
MyObject contract=新的MyObject(一些参数);
Session.Query()。其中(x=>x.Field1==contract.Field1&&x.Field2==contract.Field2..).FirstOrDefault();
我想要的是利用Equal和GetHashCode被重写的事实,这样做:

Session.Query<MyObject>().Where( x=>x.Equal(contract) ).FirstOrDefault();
Session.Query().Where(x=>x.Equal(contract)).FirstOrDefault();
但这不起作用。 我有没有办法避免在Where子句中再次键入所有字段比较?我觉得很难看


非常感谢

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

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

Equals
GetHashCode
是C#(应用程序、业务)在运行时区分对象的方法。它是一个运算符和计算值。。。它们都没有持续存在

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

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

MyObject contract = new MyObject( some parameters );
一些参数可能意味着两件事:1)标识符或2)动态搜索过滤器

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

Session.Get<MyObject>(id);
Session.Get(id);
在第二种情况下,我们很可能(肯定迟早)得到一组不断变化的值。然后我们可以动态地应用它们

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

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

    return result;
}
公共虚拟MyObject GetByCode(字符串代码) { var结果=会话 .Query() .Where(x=>x.Code==Code) .FirstOrDefault(); 返回结果; }
不会使代码变脏。事实上,此方法可能位于数据层上。因此,它以后可能会有更多的设置(按用户语言过滤…等等)。而
等于
GetHashCode
属于实体(如果可能的话是POCO),并且不应该如此动态

是的,我理解这样一个事实,即它不能在SQL中进行等效转换。然后,您很好地回答了我隐含的问题,即您所发布的实现方法不会使我的代码变脏,并且可以成为数据层的一个障碍。非常感谢,没错!正如我想告诉你的那样,你已经明白了。。。
GetByCode
非常适合这些(非常常见的)场景。祝你和NHibernate好运;)