2011-04-17 20 views
0

我正在使用Linq來查找NHibernate,並且需要查找具有以數字開頭的列(「BusinessName」)的所有記錄。Linq to nhibernate - 查找以數字開頭的值

我首先想到的是這樣的:

var numbers = Enumerable.Range(0, 10).Select(x => x.ToString()).ToList(); 
query = query.Where(x=>numbers.Contains(x.BusinessName.Substring(0,1))); 

但我發現了異常:

System.NullReferenceException: Object reference not set to an instance of an object. 
    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetEntityName(ICriteria subcriteria, String propertyName) 
    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetType(ICriteria subcriteria, String propertyName) 
    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypeUsingProjection(ICriteria subcriteria, String propertyName) 
    at NHibernate.Criterion.InExpression.AssertPropertyIsNotCollection(ICriteriaQuery criteriaQuery, ICriteria criteria) 
    at NHibernate.Criterion.InExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) 
    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) 
    at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary`2 enabledFilters) 
    at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters) 
    at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) 
    at NHibernate.Impl.CriteriaImpl.List(IList results) 
    at NHibernate.Impl.CriteriaImpl.List() 
    at NHibernate.Impl.CriteriaImpl.UniqueResult() 
    at NHibernate.Linq.Visitors.ImmediateResultsVisitor`1.HandleAggregateCall(MethodCallExpression call) 
    at NHibernate.Linq.Visitors.ImmediateResultsVisitor`1.VisitMethodCall(MethodCallExpression call) 
    at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) 
    at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp) 
    at NHibernate.Linq.Visitors.ImmediateResultsVisitor`1.GetResults(MethodCallExpression expr) 
    at NHibernate.Linq.Visitors.RootVisitor.HandleImmediateResultsCall(MethodCallExpression call) 
    at NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr) 
    at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) 
    at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp) 
    at NHibernate.Linq.Visitors.NHibernateQueryTranslator.TranslateInternal(Expression expression) 
    at NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(Expression expression, QueryOptions queryOptions) 
    at NHibernate.Linq.NHibernateQueryProvider.TranslateExpression(Expression expression) 
    at NHibernate.Linq.NHibernateQueryProvider.Execute(Expression expression) 
    at NHibernate.Linq.QueryProvider.System.Linq.IQueryProvider.Execute[T](Expression expression) 
    at System.Linq.Queryable.Count[TSource](IQueryable`1 source) 
    at SBON.ApiWrapper.SearchBusinesses(Nullable`1 id, String filter, String type, String letter, Nullable`1 start, Nullable`1 count) in D:\Data\Projects\Active\Clients\OfficeDepotSBON\src\SBON\ApiWrapper.cs:line 313 
    at SBONWeb.Controllers.MobileController.SearchBusinesses(String letter, String filter, Nullable`1 start, Nullable`1 count) in D:\Data\Projects\Active\Clients\OfficeDepotSBON\src\SBONWeb\Controllers\MobileController.cs:line 38 
    at lambda_method(Closure , ControllerBase , Object[]) 
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 

我真的不明白的例外,但我認爲它有話與我使用子字符串嘗試匹配數字列表的第一個字符,因爲我可以做到以下沒有問題:

var numbers = Enumerable.Range(0, 10).Select(x => x.ToString()).ToList(); 
query = query.Where(x=>numbers.Contains(x.BusinessName)); 

你會怎麼做?最好我正在尋找一個可以工作的LINQ查詢,但如果這是唯一的方法,我可能會使用NHibernate命名查詢(存儲過程)。

週一人羣的凹凸。

回答

0

這應該做的伎倆

query = query.Where(x => char.IsNumber(x.BusinessName[0]));