Как я могу решить "Результаты запроса не могут быть перечислены более одного раза"? - PullRequest
3 голосов
/ 29 июня 2010

если я пытаюсь написать следующие коды: ошибка возвращается ко мне: Результаты запроса не могут быть перечислены более одного раза

  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;

альтернативный текст http://i45.tinypic.com/avistc.png

Детали: альтернативный текст http://i48.tinypic.com/wss2va.png

Детали:

альтернативный текст http://i48.tinypic.com/waonbq.png

Ответы [ 6 ]

2 голосов
/ 29 июня 2010

Я не знаком с этой ошибкой.
Но в любом случае - почему вы должны перечислять более одного раза?
Это будет более эффективно с одним перечислением.

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 голос
/ 29 июня 2010

Вы можете сделать

var firstItem = stockMovementItems.First();
ReturnCode = firstItem.ReturnCode;
ReturnMsg = firstItem.ReturnMessage;
...
1 голос
/ 29 июня 2010

Краткое исправление:

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 (), вы переходите к следующему результату и не можете вернуться назад.

0 голосов
/ 29 июня 2010

как я вижу

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

вы перечисляете более одного раза ... и почему вы используете First ();?используйте ToList () в конце вашего запроса linq вместо First ().И ваша проблема будет решена.Istedigini sonuc tek bir kayittan ibaret degilse, ее zaman icin ToList () kullanmanda fayda vardir.

Также вы можете установить первое значение вашего запроса в переменную, а затем вызвать результаты в этой переменной.Boylece 1 kere перечислить etmis olur, diger sonuclarini атадигин degiskenden alabilirsiniz.

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

gibi ..

0 голосов
/ 29 июня 2010

Причина в том, что базовый DataReader использует курсор только вперед.Когда у вас есть первая запись, она не может вернуться (как с другим перечислением).

0 голосов
/ 29 июня 2010

Вы не должны использовать First () все время!Попробуйте перехватить значение, которое выходит из First (), в переменную и использовать эту переменную для получения значений ReturnCode и ReturnMessage из (или посмотрите, есть ли что-то вроде .current в объекте).

Проблемав том, что, вызывая First (), вы сообщаете курсору переместить позицию, после вызова First () во второй раз, когда система думает, что вы идете назад через элементы, которые могут быть не разрешены для этого объекта (существуют коллекции, которые неидти назад).

Лучший вариант - записать объект, возвращенный из First (), в переменную и использовать его для своей работы (это также лучше, потому что вы не будете каждый раз читать из коллекции).).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...