2010-06-29 58 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; 

吉比..

相關問題