NHibernate QueryOver中的GUID比较引发错误

NHibernate QueryOver中的GUID比较引发错误,nhibernate,queryover,Nhibernate,Queryover,我正在尝试获取所有产品,其中CheckedOutToGuid为空或是当前用户的Guid。我已尝试使用以下查询: public IEnumerable<IProduct> GetProducts(IUser user, Expression<Func<IProduct, bool>> predicate) { return Context.GetSession().QueryOver<Product>()

我正在尝试获取所有
产品
,其中
CheckedOutToGuid
为空或是当前用户的Guid。我已尝试使用以下查询:

    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();
    }
这个错误的原因是什么?我尝试删除
(x.CheckedOutByGuid==null)
,因此不需要或,但仍然会得到相同的错误

更新

正如安德鲁·惠特克所说,我换了一行

   .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.
Atf.NUnit.Model.TestDatabase.TestModule1():
NHibernate.QueryException:无法解析属性:用户:Atf.Model.Internal.Product
p:\NHibernate core\src\NHibernate\Persister\Entity\AbstractPropertyMapping.ToType(字符串propertyName)中的bei-NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(字符串propertyName)。
bei NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclass PropertyTableNumber(字符串propertyPath)位于p:\NHibernate core\src\NHibernate\Persister\Entity\AbstractEntityTypersister.cs:Zeile 1776中。
bei NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(字符串别名,字符串属性名称)位于p:\NHibernate core\src\NHibernate\Persister\Entity\BasicEntityPropertyMapping.cs:Zeile 31中。
bei NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(字符串别名,字符串属性名称)位于p:\NHibernate core\src\NHibernate\Persister\Entity\AbstractEntityTyperSister.cs:Zeile 1742中。
p:\NHibernate core\src\NHibernate\Loader\Criteria\CriteriaQueryTranslator.cs:Zeile 590中的bei NHibernate.Loader.Criteria.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria subcriteria,String propertyName)。
bei NHibernate.Loader.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria,String propertyName)在p:\NHibernate core\src\NHibernate\Loader\Criteria\CriteriaQueryTranslator.cs:Zeile 561中。
bei NHibernate.criteria.CriterionUtil.GetColumnNames使用p:\NHibernate core\src\NHibernate\CriterionUtil.cs:Zeile 64中的propertyName(ICriteQuery criteriaQuery,ICriteria criteria,String propertyName)。
p:\NHibernate core\src\NHibernate\criterianutil\CriterionUtil.cs:Zeile 20中的bei NHibernate.criteria.CriterionUtil.GetColumnNames(字符串属性名称、IProjection投影、ICriteriaQuery criteriaQuery、ICriteria criteria、IDictionary`2 enabledFilters)。
在p:\NHibernate core\src\NHibernate\criteria\criteriaexpression.cs:Zeile 74中,bei NHibernate.criteria.PropertyExpression.ToSqlString(ICriteria criteria,ICriteriaQuery criteriaQuery,IDictionary`2 enabledFilters)。
p:\NHibernate core\src\NHibernate\criteria\LogicalExpression.ToSqlString(ICriteria criteria,ICriteriaQuery criteriaQuery,IDictionary`2 enabledFilters)中的bei NHibernate.criteria.LogicalExpression.ToSqlString。
p:\NHibernate core\src\NHibernate\Loader\Criteria\CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters)中的bei-NHibernate.Loader.Criteria.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters)。
p:\NHibernate core\src\NHibernate\Loader\CriteriaJoinWalker.cs:Zeile 58中的bei-NHibernate.Loader.Criteria.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable持久化器、CriteriaQueryTranslator转换器、ISessionFactoryImplementor工厂、ICriteria标准、字符串rootEntityName、IDictionary`2 enabledFilters)。
bei NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable持久化程序、ISessionFactoryImplementor工厂、CriteriaImpl rootCriteria、字符串rootEntityName、IDictionary`2 enabledFilters)位于p:\NHibernate core\src\NHibernate\Loader\Criteria\CriteriaLoader.cs:Zeile 41中。
p:\NHibernate core\src\NHibernate\Impl\SessionImpl.cs:Zeile 1948中的bei NHibernate.Impl.SessionImpl.List(CriteriaImpl标准,IList结果)。
bei NHibernate.Impl.CriteriaImpl.List(IList结果)位于p:\NHibernate core\src\NHibernate\Impl\CriteriaImpl.cs:Zeile 265。
p:\NHibernate core\src\NHibernate\Impl\CriteriaImpl.cs:Zeile 276中的bei NHibernate.Impl.CriteriaImpl.List[T]()。
p:\NHibernate core\src\NHibernate\criteria\QueryOver.cs:Zeile 67中的bei NHibernate.criteria.QueryOver`1.List()。
p:\NHibernate core\src\NHibernate\criteria\QueryOver.cs:Zeile 214中的bei-NHibernate.criteria.QueryOver`1.NHibernate.IQueryOver.List()。
bei Atf.Model.Database.DatabasePersistence.GetProducts(IUser用户,表达式`1谓词)位于D:\my_Workspace\visualstudioprojects\MyTestFramework\Atf.Model\Database\DatabasePersistence.cs:Zeile 247中。
bei Atf.NUnit.Model.TestDatabase.TestModule1()位于D:\my_Workspace\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();
    }
public IEnumerable GetProducts(IUser用户,表达式谓词)
{
Guid g=user.UserGuid;
返回Context.GetSession().QueryOver()
.其中(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的内容,因此出现异常

如果将该行更改为:

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

一切正常。

谢谢!这实际上是我第一次尝试,但出现了其他错误。请查看我的更新。
.Where(x => (x.CheckedOutByGuid == null) || user.UserGuid == x.CheckedOutByGuid)