如何解决“查询结果不能多​​次枚举”?

时间:2010-06-29 06:12:05

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

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

  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;

alt text http://i45.tinypic.com/avistc.png

详细说明: alt text http://i48.tinypic.com/wss2va.png

细节:

alt text http://i48.tinypic.com/waonbq.png

6 个答案:

答案 0 :(得分:2)

我不熟悉这个错误 但无论如何 - 你为什么要不止一次列举? 只需一次枚举就可以提高效率。

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;

答案 1 :(得分:1)

简短修复:

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()时,您将前进到下一个结果,并且无法返回。

答案 2 :(得分:1)

你可以做到

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

原因是底层DataReader正在使用仅向前游标。当你得到第一个条目时它就不能返回(就像用另一个枚举那样)。

答案 5 :(得分:0)

我看到了

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。

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

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

吉比..