【问题标题】:Sequence contains no elements even though I add OrDefault即使我添加了 OrDefault,序列也不包含任何元素
【发布时间】: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)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid
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)

我尝试使用的代码是:

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


【解决方案1】:

可能下面的序列不包含任何元素:

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

所以它不能对空(默认)元素执行以下操作

.AsInt() + 1;

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

【讨论】:

  • 但那将是 NullReferenceException。
  • 如果AsInt 是扩展方法,则不会。检查这个:dotnetfiddle.net/JOxRRc
  • 不在调用中,但在函数中是不可避免的。它会接受一个标量,而不是一个序列,你的 dotnetfiddle 不会导致任何错误。但我们正在寻找错误的根源。返回一个导致非空引用异常的小提琴。
  • FirstOrDefault 返回一个标量,而不是一个序列。这将是AsInt 方法的输入。
  • 准确地说——但是我们看到的错误是指一个序列。
猜你喜欢
  • 2021-04-26
  • 2015-09-04
  • 2015-02-19
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
相关资源
最近更新 更多