【发布时间】:2017-11-07 18:24:11
【问题描述】:
我一生都遇到了一个我无法解决的错误。 我得到的错误如下:
[InvalidOperationException]:序列在 NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery 查询, NhLinqExpression nhQuery) 在 NHibernate.Linq.DefaultQueryProvider.Execute(表达式表达式)
在 NHibernate.Linq.DefaultQueryProvider.Execute[TResult](表达式 表达式)在 System.Linq.Queryable.First[TSource](IQueryable1 source) at Nichols.Web.Controllers.LoadController.RttInUse(String rttNumber) in c:\projects\NicholsFarms_demo_newCropYear\Nichols\src\Nichols.Web\Controllers\LoadController.cs:line 71 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 参数)在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.c__DisplayClass46.b__3f() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.c__DisplayClass33.b__32(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.c__DisplayClass21.c__DisplayClass2b.b__1c() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.c__DisplayClass21.b__1e(IAsyncResult asyncResult) 在 System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) 在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)1.CallEndDelegate(IAsyncResult asyncResult) 在 System.Web.Mvc.MvcHandler.b__5(IAsyncResult asyncResult, ProcessRequestState innerState) 在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) 在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid
我尝试使用的代码是:
public ActionResult RttInUse(string rttNumber)
{
int validNumber;
int recommendRttNumber = 0;
var cropYear = _session.Query<CropYear>().SingleOrDefault(x => x.IsCurrent);
if (cropYear.RttRangeHaveBeenConfiguredForNewCropYear)
{
recommendRttNumber = _session.Query<Load>()
.Where(x =>
x.CropYear == cropYear &&
!x.RttNumber.Contains("VOID") &&
x.RttNumber.Length < 9)
.OrderByDescending(x => x.Id)
.Select(x => x.RttNumber)
.FirstOrDefault(x => int.Parse(x) >= cropYear.RttNumberRangeStart &&
int.Parse(x) <= cropYear.RttNumberRangeEnd).AsInt() + 1;
}
if (rttNumber == null || !int.TryParse(rttNumber, out validNumber))
{
return AsJson(
"Rtt number invalid, numeric values only. Next Rtt Number should be " +
recommendRttNumber);
}
var loadExists = _session.Query<Load>()
.Any(x =>
x.RttNumber.ToLower() == rttNumber.ToLower() &&
x.CropYear == cropYear);
if (loadExists)
{
return AsJson("Rtt Number already in use. Next Rtt Number should be " +
recommendRttNumber);
}
return AsJson(true);
}
基本上,当操作员在表单上输入诸如 150001 之类的字符串时,他们输入的值会与数据库中的可接受范围进行比较。
作物年份有条目,因此 2015 年的可接受范围为 150001 到 159999,可从中选择 RttNumberRangeStart 到 RttNumberRangeEnd;如果正在使用,他们应该得到推荐当前使用的 rttnumber + 1。
【问题讨论】:
-
您是否真的在某处设置了默认值?将null coaleasing operator ?? 与
orDefault语句一起使用怎么样? -
错误转储显示您正在调用
First(),而不是FirstOrDefault()。是上次运行的错误转储吗?我们可能正在尝试调试错误的问题。 -
异常发生在哪一行?
-
它似乎在第 71 行,其中显示:if (rttNumber == null || !int.TryParse(rttNumber, out validNumber)) { return AsJson("Rtt number invalid, numeric values仅。下一个 Rtt 编号应为 " + RecommendationRttNumber); }
-
那行号是没有意义的,那行调用 NHibernate 的查询系统没有任何意义。你确定你正在使用当前版本吗?你清理过你的工作区并再次测试了吗? @JamesCurran 可能在正确的轨道上
标签: c# asp.net-mvc linq