2013-05-06 1 views
3

CheckedOutToGuid이 null이거나 현재 사용자의 GUID 인 모든 Product을 가져 오려고합니다. 나는 다음과 같은 QueryOver 사용하는 것을 시도했다 :NHibernate에서 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이 필요하지 않지만 여전히 동일한 오류가 발생합니다.

UPDATE

sugggested @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이 null 인 것을 알게되었을 때입니다 .--(이것이 오류의 원인이었습니다. 오류 메시지는 나를 아주 잘못된 방향으로 인도했습니다.

답변

4

NHibernate가 Guid.Equals을 SQL 표현식으로 변환하려고 시도하고 있습니다. NHibernate는 Guid.Equals을 SQL로 변환 할 수있는 것으로 인식하지 않으므로 예외가됩니다. 당신이 읽고 그 라인을 변경하는 경우

:

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

모든 것이 잘 작동합니다.

+0

감사합니다. 이것은 실제로 첫 시도이지만 다른 오류가 있습니다. 내 업데이트를 한번보십시오. – paul

관련 문제