2017-06-06 48 views
0

我得到一个我无法解决的生活错误。 我得到的错误是如下:序列不包含元素,即使我添加OrDefault

[InvalidOperationException异常]:序列含有 NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression,IQUERY查询,NhLinqExpression nhQuery)没有元素在 NHibernate.Linq.DefaultQueryProvider .Execute在System.Linq.Queryable.First [TSource](表达式表达)
在NHibernate.Linq.DefaultQueryProvider.Execute [TResult](式 表达)(IQueryable的1 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, IDictionary 2参数)在 System.Web.Mvc.ControllerActionInvoker .InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary的2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult的 asyncResult)在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters。 <> c__DisplayClass46.b__3f() at System.Web.Mvc.Async.AsyncControllerActionInvoker。 <> c__DisplayClass33.b__32(IAsyncResult asyncResult)at System.Web.Mvc.Async.AsyncControllerActionInvoker。 <> c__DisplayClass21。 <> c__DisplayClass2b.b__1c() at 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.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid
1.CallEndDelegate(IAsyncResult的 asyncResult )在 System.Web.Mvc.MvcHandler.b__5(在 System.Web.HttpApplication的IAsyncResult asyncResult,ProcessRequestState innerState)在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult的 asyncResult)。 CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IEx ecutionStep步骤, 布尔& completedSynchronously)

,我试图使用的代码是:

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。

+0

你真的在某处设置了一个默认值吗?如何将[null coaleasing operator ??](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/null-conditional-operator)与'orDefault'语句一起使用? –

+1

错误转储表示您调用'First()',而不是'FirstOrDefault()'。这是上次运行的错误转储吗?我们可能试图调试错误的问题。 –

+1

也在哪一行发生异常? –

回答

2

大概低于序列不包含任何元素:

.FirstOrDefault(x => int.Parse(x) >= cropYear.RttNumberRangeStart && 
        int.Parse(x) <= cropYear.RttNumberRangeEnd) 

所以它不能对空以下(默认)元件

.AsInt() + 1; 

假设RttNumberstringAsInt()扩展方法以将string转换为int,将其更改为在string上返回0

+0

但这将是一个NullReferenceException。 –

+0

如果'AsInt'是扩展方法,则不会。选中此项:https://dotnetfiddle.net/JOxRRc –

+0

不在通话中,但在功能中不可避免。它会接受一个标量,而不是一个顺序,你的dotnetfiddle不会导致任何错误。但是我们正在寻找错误的来源。回来一个导致非nullreference异常的小提琴。 –