none
LinQ序列不包含任何元素 RRS feed

  • 问题

  •  

    “/web”应用程序中的服务器错误。

    序列不包含任何元素

    说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.InvalidOperationException: 序列不包含任何元素

    源错误:

    行 15: 
    
    行 16:    DataClassesDataContext dataCC = new DataClassesDataContext();
    
    行 17:    Books books = dataCC.Books.Single(b => b.Id == id);
    
    行 18:    return books;
    
    行 19: 

    源文件: d:\shuchen\DAL\Service\BookService.cs    行: 17

    堆栈跟踪:

    [InvalidOperationException: 序列不包含任何元素]
    
     System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +1151
    
     System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +113
    
     System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +344
    
     System.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute(Expression expression) +56
    
     System.Linq.Queryable.Single(IQueryable`1 source, Expression`1 predicate) +300
    
     DAL.BookService.GetByBookId(Int32 id) in d:\shuchen\DAL\Service\BookService.cs:17
    
     BLL.BookManager.GetByBookId(Int32 id) in d:\shuchen\BLL\Manager\BookManager.cs:17
    
    
    
    [TargetInvocationException: 调用的目标发生了异常。]
    
     System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) +0
    
     System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner) +72
    
     System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +251
    
     System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +28
    
     System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod method, Boolean disposeInstance, Object& instance) +486
    
     System.Web.UI.WebControls.ObjectDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1953
    
     System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +21
    
     System.Web.UI.WebControls.DataBoundControl.PerformSelect() +143
    
     System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74
    
     System.Web.UI.WebControls.GridView.DataBind() +4
    
     System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +66
    
     System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +75
    
     System.Web.UI.Control.EnsureChildControls() +102
    
     System.Web.UI.Control.PreRenderRecursiveInternal() +42
    
     System.Web.UI.Control.PreRenderRecursiveInternal() +175
    
     System.Web.UI.Control.PreRenderRecursiveInternal() +175
    
     System.Web.UI.Control.PreRenderRecursiveInternal() +175
    
     System.Web.UI.Control.PreRenderRecursiveInternal() +175
    
     System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2496
    
    


    版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.1

    2011年8月13日 6:39

答案

  • 改用SingleOrDefault取代Single,不過在使用前還必須判斷是否books為null。

    我以Northwind為例來模擬你的狀況,您可以參考看看。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
      public partial class LINQ : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          if (GetRegion() != null)
          {
            Response.Write(GetRegion().RegionID);
          }
          else
          {
            Response.Write("Not Found.");
          }
        }
    
        private Region GetRegion()
        {
          Region region = null;
          using (NorthwindEntities context = new NorthwindEntities())
          {
            region = context.Regions.SingleOrDefault(o => o.RegionID == 8);
          }
          return region;
        }
      }
    }



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月14日 5:41
  • 我已经解决了,因为我数据库Book表里面没有ID为0的数据,然后我,把Single换为SingleOrDefault了,然后修改为了查询的方法,之前我是用ID查询的,现在是查询所有的数据
    2011年8月19日 6:49

全部回复

  • 建議在使用Single方法前多加判斷,就可以避免因為回傳的資料為空時所出現的錯誤訊息,例如下列的程式碼:

     

    Books books = null;
    if (dataCC.Books.Any())
     books = dataCC.Books.Single(b => b.Id == id);
    


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月13日 9:17
  • 建議在使用Single方法前多加判斷,就可以避免因為回傳的資料為空時所出現的錯誤訊息,例如下列的程式碼:

     

    Books books = null;
    
    if (dataCC.Books.Any())
    
     books = dataCC.Books.Single(b => b.Id == id);
    
    


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    我照你的辦法試了,還是出現問題
    2011年8月14日 3:59
  • 改用SingleOrDefault取代Single,不過在使用前還必須判斷是否books為null。

    我以Northwind為例來模擬你的狀況,您可以參考看看。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
      public partial class LINQ : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          if (GetRegion() != null)
          {
            Response.Write(GetRegion().RegionID);
          }
          else
          {
            Response.Write("Not Found.");
          }
        }
    
        private Region GetRegion()
        {
          Region region = null;
          using (NorthwindEntities context = new NorthwindEntities())
          {
            region = context.Regions.SingleOrDefault(o => o.RegionID == 8);
          }
          return region;
        }
      }
    }



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月14日 5:41
  • 改用SingleOrDefault取代Single,不過在使用前還必須判斷是否books為null。

    我以Northwind為例來模擬你的狀況,您可以參考看看。

     

    using System;
    
    
    
    using System.Collections.Generic;
    
    
    
    using System.Linq;
    
    
    
    using System.Web;
    
    
    
    using System.Web.UI;
    
    
    
    using System.Web.UI.WebControls;
    
    
    
    
    
    
    
    namespace WebApplication1
    
    
    
    {
    
    
    
     public partial class LINQ : System.Web.UI.Page
    
    
    
     {
    
    
    
     protected void Page_Load(object sender, EventArgs e)
    
    
    
     {
    
    
    
      if (GetRegion() != null)
    
    
    
      {
    
    
    
      Response.Write(GetRegion().RegionID);
    
    
    
      }
    
    
    
      else
    
    
    
      {
    
    
    
      Response.Write("Not Found.");
    
    
    
      }
    
    
    
     }
    
    
    
    
    
    
    
     private Region GetRegion()
    
    
    
     {
    
    
    
      Region region = null;
    
    
    
      using (NorthwindEntities context = new NorthwindEntities())
    
    
    
      {
    
    
    
      region = context.Regions.SingleOrDefault(o => o.RegionID == 8);
    
    
    
      }
    
    
    
      return region;
    
    
    
     }
    
    
    
     }
    
    
    
    }
    
    
    
    


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    我用了SingleOrDefault,GridView然后不显示
    2011年8月15日 14:14
  • 用GridView显示  那方法返回的应该是一个数据集吧  不应该返回一个实体

     

     

    行 16:  DataClassesDataContext dataCC = new DataClassesDataContext();
    
    行 17:  var books = dataCC.Books.Where(b => b.Id == id);
            //Books books = dataCC.Books.FirstOrDefault(b => b.Id == id);
    行 18: return books.ToList();

     




    Best Regards,
    If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".
    2011年8月15日 16:22
  • 如同MVP所說的要設定給Data Binding Control的DataSource,必須是IListSource、IEnumerable 或 IDataSource。

    我把Sample Code改成下列的樣子,使用List<T>泛型當作回傳的型態,再搭配Take和Skip方法,你可以參考看看,看是否符合你的需求。

     

    //新函式
    /// <summary>
    /// 取得訂單明細
    /// </summary>
    /// <param name="orderID">訂單編號</param>
    /// <param name="takeCount">每次取得筆數</param>
    /// <param name="skipCount">從第幾筆開始取</param>
    /// <returns></returns>
    private List<Order_Detail> GetOrderDetail(int orderID,int takeCount,int skipCount)
    {
    	using (NorthwindEntities context = new NorthwindEntities())
    	{
    		var query = from p in context.Order_Details
    					where p.OrderID == orderID
    					orderby p.ProductID
    					select p;
    		//不過濾,取出全部
    		if (takeCount == -1)
    		{
    			return query.ToList<Order_Detail>();
    		}
    		else //根據輸入參數取得資料
    		{
    			if (takeCount > query.Count()) takeCount = query.Count();
    			if (skipCount < 0) skipCount = 0;
    			return query.Skip(skipCount).Take(takeCount).ToList<Order_Detail>();
    		}
    	}
    }
    


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月15日 23:00
  •  DataClassesDataContext dataCC = new DataClassesDataContext();

      Books books = dataCC.Books.SingleOrDefault(b => b.Id == id);

       return books。ToList();
    要确保id是唯一的。

    发现问题,解决问题!
    2011年8月18日 3:02
  • 我已经解决了,因为我数据库Book表里面没有ID为0的数据,然后我,把Single换为SingleOrDefault了,然后修改为了查询的方法,之前我是用ID查询的,现在是查询所有的数据
    2011年8月19日 6:48
  • 我已经解决了,因为我数据库Book表里面没有ID为0的数据,然后我,把Single换为SingleOrDefault了,然后修改为了查询的方法,之前我是用ID查询的,现在是查询所有的数据
    2011年8月19日 6:49
  • 我已经解决了,因为我数据库Book表里面没有ID为0的数据,然后我,把Single换为SingleOrDefault了,然后修改为了查询的方法,之前我是用ID查询的,现在是查询所有的数据,谢谢你花这么多时间,耐心的帮我解决问题,你提供的方法,我已经记下来了,

    有空会试试。

     

    2011年8月19日 6:50