2010-06-29 44 views
3

如果我尝试写下面的代码:错误返回给我:查询结果不能枚举不止一次我该如何解决“查询结果不能一次枚举”?

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

回答

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

我不熟悉这个错误。
但无论如何 - 为什么你应该枚举多次?
只需一次枚举就会更高效。

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; 
0

您不应该使用First()整个时间!尝试将First()中出现的值捕获到变量中,并使用该变量从对象中获取值ReturnCode和ReturnMessage(或查看是否存在诸如.current之类的内容)。

问题是,通过调用First(),你告诉光标移动位置,在第二次调用First()之后,系统认为你要通过这个对象可能不允许的项目后退是不允许你走回头路的藏品)。

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

1

你可以做

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

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

0

,我看到

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

你列举不止一次..为什么ü使用第一(); ? 在您的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; 

吉比..

相关问题