【问题标题】:How can I solve "The query results cannot be enumerated more than once"?如何解决“查询结果不能枚举多次”?
【发布时间】:2010-06-29 06:12:04
【问题描述】:

如果我尝试编写以下代码:错误返回给我:查询结果不能被枚举多次

  public void StartTransaction()
        {
            using (var stockMovementCtx = new StockMovementCtxDataContext())
            using (var scope = new TransactionScope())
            {

                var stockMovementItems = from s in stockMovementCtx.spStockMovementForTransaction(TicketID, ItemTypeNo, ItemID, TransactionType,
                                                                                                  FromLocation, ToLocation, Qty, PersonelNo, cuser
                                                                                                  )
                                         select s;

                ReturnCode = stockMovementItems.First().ReturnCode;
               // MessageBox.Show(stockMovementItems.First().ToString());
                ReturnMsg = stockMovementItems.First().ReturnMessage;
                TransactionType = stockMovementItems.First().TransactionType;
                TicketID = stockMovementItems.First().TicketID;

详情:

详情:

【问题讨论】:

    标签: c# visual-studio visual-studio-2008 linq linq-to-sql


    【解决方案1】:

    我不熟悉这个错误。
    但无论如何 - 为什么要多次列举?
    仅使用一次枚举将更有效。

    public void StartTransaction()
            {
                using (var stockMovementCtx = new StockMovementCtxDataContext())
                using (var scope = new TransactionScope())
                {
    
                    var stockMovementItems = from s in stockMovementCtx.spStockMovementForTransaction(TicketID, ItemTypeNo, ItemID, TransactionType,
                                                                                                      FromLocation, ToLocation, Qty, PersonelNo, cuser
                                                                                                      )
                                             select s;
    
                    var item = stockMovementItems.FirstOrDefault()
                    if (item != null)
                    {
                        ReturnCode = (item.ReturnCode;
                       // MessageBox.Show((item.ToString());
                        ReturnMsg = item.ReturnMessage;
                        TransactionType = item.TransactionType;
                        TicketID = item.TicketID;
    

    【讨论】:

      【解决方案2】:

      短期修复:

      var FirstChild = stockMovementItems.First();
      

      然后

      ReturnCode = FirstChild.ReturnCode;
      //etc...
      

      (from s in stockMovementCtx.spStockMovementForTransaction(TicketID, ItemTypeNo, ItemID, TransactionType, FromLocation, ToLocation, Qty, PersonelNo, cuser) select s).ToList();
      

      但后者有点滥用 Linq。

      更长的答案是,无论 stockMovementCtx.spStockMovementForTransaction(..) 是什么,它都只支持向前阅读。因此,当您调用 First() 时,您会前进到下一个结果并且无法返回。

      【讨论】:

        【解决方案3】:

        你可以的

        var firstItem = stockMovementItems.First();
        ReturnCode = firstItem.ReturnCode;
        ReturnMsg = firstItem.ReturnMessage;
        ...
        

        【讨论】:

          【解决方案4】:

          你不应该一直使用 First() !尝试将来自 First() 的值捕获到一个变量中,并使用该变量从中获取值 ReturnCode 和 ReturnMessage(或查看对象中是否存在类似 .current 的内容)。

          问题是通过调用 First() 你告诉光标移动位置,在第二次调用 First() 之后系统认为你正在向后遍历可能不允许该对象的项目(有不允许你走回去的收藏品)。

          最好的选择是将 First() 返回的对象捕获到一个变量中并将其用于您的工作(这也更好,因为您不会每次都从集合中读取)。

          【讨论】:

            【解决方案5】:

            原因是底层 DataReader 使用的是只进游标。当您获得第一个条目时,它不能返回(就像另一个枚举一样)。

            【讨论】:

              【解决方案6】:

              如我所见

              ReturnCode = stockMovementItems.First().ReturnCode; // MessageBox.Show(stockMovementItems.First().ToString()); ReturnMsg = stockMovementItems.First().ReturnMessage; TransactionType = stockMovementItems.First().TransactionType; TicketID = stockMovementItems.First().TicketID;

              你不止一次列举了......以及你为什么使用 First(); ? 在 linq 查询结束时使用 ToList() 而不是 First()。你的问题将得到解决。 Istedigini sonuc tek bir kayittan ibaret degilse,她的 zaman icin ToList() kullanmanda fayda vardir。

              您还可以将查询结果的第一个值设置为变量,然后在该变量上调用结果。 Boylece 1 kere enumerate etmis olur, diger sonuclarini atadigin degiskenden alabilirsiniz。

              var myResult = stockMovementItems.First();
              ReturnCode = myResult.ReturnCode;
              ReturnMsg = myResult.ReturnMessage;
              

              吉比..

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多