Domanda

Whenever I make an Ajax call to a certain method, it gives an InvalidOperationException with the message "sequence contains no elements", which is obvious as I want to verify that it gives an error when entering a non-existing article.

The Ajax which calls to the method

$.ajax({
    url: '@Url.Action("GetArticleName", "Date")',
    data: JSON.stringify({ barcode: $("#ArticleBarcode").val() }),

    type: 'POST',
    contentType: 'application/json; charset=utf-8',

    dataType: 'json',
    success: function (result) {
        var divInsert = document.getElementById("ArticleName");
        divInsert.innerHTML = result;
        validArticle = true;
    },

    error: function (xhr, s, error) {
        if (xhr.status == 404) {
            var divInsert = document.getElementById("ArticleName");
            divInsert.innerHTML = "Varen blev ikke fundet";
        }
        else {
            alert("error: " + s);
        }
        validArticle = false;
    }
});

The method which returns the error

[HttpPost]
public ActionResult GetArticleName(long barcode)
{
    ArticleDbContext artdb = new ArticleDbContext();
    String article = (String)(from art in artdb.Articles where art.Barcode == barcode select art.Name).SingleOrDefault();
    if (article == null)
    {
        return HttpNotFound();
    }
    return Json(article);
}

Stacktrace

[InvalidOperationException: Sekvensen indeholder ingen elementer] 
System.Linq.Enumerable.First(IEnumerable`1 source) +269
System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__0(IEnumerable`1 sequence) +40
System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +59
System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +133
System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +123
System.Linq.Queryable.First(IQueryable`1 source) +251
DatoCheckerMvc.Controllers.DateController.GetArticleName(Int64 barcode) in c:\Users\frederik\Documents\Visual Studio 2012\Projects\DatoCheckerMvc\DatoCheckerMvc\Controllers\DateController.cs:66   lambda_method(Closure , ControllerBase , Object[] ) +165
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +48
System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +57
System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +223
System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +48
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +43
System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +47
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +47
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9690172
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

I have tried to insert a breakpoint at the line with the Linq query but it seems to throw it already on the method with the method name.

What is the problem?

È stato utile?

Soluzione

Change your query to:

var article = from art in artdb.Articles where art.Barcode == barcode select art;

var firstUser = article .SingleOrDefault();

or

var firstUser = article .FirstOrDefault();

Altri suggerimenti

you need to use FirstOrDefault() as more than one objects may exist.

do like this:

var result = (from art in artdb.Articles 
              where art.Barcode == barcode 
              select art).FirstOrDefault();

string Name = result.Name;

you can also do like this:

 var result = artdb.Articles.FirstOrDefault(art=>art.Barcode == barcode);

but If only one object will always be returned then use SingleOrDefault():

 var result = artdb.Articles.SingleOrDefault(art=>art.Barcode == barcode);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top