如果我尝试写下面的代码:错误返回给我:查询结果不能多次枚举
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
细节:
答案 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;
吉比..