nhibernate - NHibernate QueryOver 中的 GUID 比较引发错误

标签 nhibernate queryover

我正在尝试获取所有 Product哪里CheckedOutToGuid为 null 或当前用户的 Guid。我曾尝试使用以下 QueryOver:

    public IEnumerable<IProduct> GetProducts(IUser user, Expression<Func<IProduct, bool>> predicate)
    {
        return Context.GetSession().QueryOver<Product>()
            .Where(x => (x.CheckedOutByGuid == null) || Guid.Equals(user.UserGuid, x.CheckedOutByGuid)
            .OrderBy(x => x.Version).Desc
            .OrderBy(x => x.DisplayName).Asc.List();
    }

但我收到一个错误:
Atf.NUnit.Model.TestDatabase.TestModule1():
System.Exception : Unrecognised method call: System.Object:Boolean Equals(System.Object, System.Object)

这个错误的原因是什么?我尝试删除 (x.CheckedOutByGuid == null)这样就不需要 OR 但仍然会出现相同的错误。

更新

@Andrew Whitaker建议,我换了一行
   .Where(x => (x.CheckedOutByGuid == null) || (user.UserGuid == x.CheckedOutByGuid))

这现在导致以下异常:
Atf.NUnit.Model.TestDatabase.TestModule1():
NHibernate.QueryException : could not resolve property: user of: Atf.Model.Internal.Product
bei NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName) in p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractPropertyMapping.cs:Zeile 37.
bei NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclassPropertyTableNumber(String propertyPath) in p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 1776.
bei NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(String alias, String propertyName) in p:\nhibernate-core\src\NHibernate\Persister\Entity\BasicEntityPropertyMapping.cs:Zeile 31.
bei NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(String alias, String propertyName) in p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 1742.
bei NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria subcriteria, String propertyName) in p:\nhibernate-core\src\NHibernate\Loader\Criteria\CriteriaQueryTranslator.cs:Zeile 590.
bei NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria, String propertyName) in p:\nhibernate-core\src\NHibernate\Loader\Criteria\CriteriaQueryTranslator.cs:Zeile 561.
bei NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, String propertyName) in p:\nhibernate-core\src\NHibernate\Criterion\CriterionUtil.cs:Zeile 64.
bei NHibernate.Criterion.CriterionUtil.GetColumnNames(String propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria, IDictionary`2 enabledFilters) in p:\nhibernate-core\src\NHibernate\Criterion\CriterionUtil.cs:Zeile 20.
bei NHibernate.Criterion.PropertyExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) in p:\nhibernate-core\src\NHibernate\Criterion\PropertyExpression.cs:Zeile 74.
bei NHibernate.Criterion.LogicalExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) in p:\nhibernate-core\src\NHibernate\Criterion\LogicalExpression.cs:Zeile 77.
bei NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) in p:\nhibernate-core\src\NHibernate\Loader\Criteria\CriteriaQueryTranslator.cs:Zeile 202.
bei NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary`2 enabledFilters) in p:\nhibernate-core\src\NHibernate\Loader\Criteria\CriteriaJoinWalker.cs:Zeile 58.
bei NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters) in p:\nhibernate-core\src\NHibernate\Loader\Criteria\CriteriaLoader.cs:Zeile 41.
bei NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:Zeile 1948.
bei NHibernate.Impl.CriteriaImpl.List(IList results) in p:\nhibernate-core\src\NHibernate\Impl\CriteriaImpl.cs:Zeile 265.
bei NHibernate.Impl.CriteriaImpl.List[T]() in p:\nhibernate-core\src\NHibernate\Impl\CriteriaImpl.cs:Zeile 276.
bei NHibernate.Criterion.QueryOver`1.List() in p:\nhibernate-core\src\NHibernate\Criterion\QueryOver.cs:Zeile 67.
bei NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver<TRoot>.List() in p:\nhibernate-core\src\NHibernate\Criterion\QueryOver.cs:Zeile 214.
bei Atf.Model.Database.DatabasePersistence.GetProducts(IUser user, Expression`1 predicate) in D:\my_workspaces\visualstudioprojects\MyTestFramework\Atf.Model\Database\DatabasePersistence.cs:Zeile 247.
bei Atf.NUnit.Model.TestDatabase.TestModule1() in D:\my_workspaces\visualstudioprojects\MyTestFramework\Atf.zNUnit.Model\TestDatabase.cs:Zeile 59.

好吧,然后我尝试了这个:
    public IEnumerable<IProduct> GetProducts(IUser user, Expression<Func<IProduct, bool>> predicate)
    {
        Guid g = user.UserGuid;
        return Context.GetSession().QueryOver<Product>()
            .Where(x => (x.CheckedOutByGuid == null) || (g == x.CheckedOutByGuid))
            .OrderBy(x => x.Version).Desc
            .OrderBy(x => x.DisplayName_DE).Asc.List();
    }

这就是我发现 user 的时候为空 :-( 这是导致错误的原因。 错误消息将我引向了完全错误的方向。

最佳答案

NHibernate 正试图转 Guid.Equals成 SQL 表达式。 NHibernate 无法识别 Guid.Equals作为它可以变成 SQL 的东西,因此是异常(exception)。

如果您将该行更改为:

.Where(x => (x.CheckedOutByGuid == null) || user.UserGuid == x.CheckedOutByGuid)

一切都应该正常工作。

关于nhibernate - NHibernate QueryOver 中的 GUID 比较引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401766/

相关文章:

c# - NHibernate QueryOver 用投影填充父对象中的属性对象

c# - 使用 Windows 身份验证的 NHibernate 模拟

c# - 在 SQLQuery 中使用 ":="

c# - 创建 NHibernate Queryover 以获取两个字段乘积的总和

c# - 使用 QueryOver/ICriteria 在 NHibernate 中聚合左连接

nhibernate - 使用 JoinQueryOver : Get greatgrandchildren, 获取知道父亲

.net - NHibernate奇怪的错误

linq - Nhibernate 3.2 查询与 QueryOver

IUserType 上的 NHibernate QueryOver

nhibernate - 查询多对多项目