Невозможно привести объект типа «WhereListIterator`1 [Web.Model.Appointment]» к типу «Web.Model.Appointment». - PullRequest
5 голосов
/ 09 марта 2012

Это фрагмент кода с моего контроллера

[HttpPost]
public ActionResult Cancel(string id,FormCollection collection)
{
   //This is how I would like to declare appt but I cannot seem to correctly pass id into this method
   //var appt = Application.Session.GetObjectFromOid<Appointment>(new ObjectId(id));

   //I am trying to do it this way instead but I get an error
   var appt = (Appointment)Application.Appointments.Where(a=>a.Id.Equals(collection["Id"]));
   .....
}

Это ошибка, которую я получаю: Невозможно привести объект типа 'WhereListIterator`1 [Web.Model.Appointment]' к типу 'Web.Model.Appointment'.

Это мой взгляд:

<input type="button" value="Save" onclick="updateCancel(); return false;" /><button>Save</button>

и это моя функция

 function updateCancel() {
    $('#cancel').ajaxSubmit({

    });
    }

Так почему я получаю эту ошибку? ИЛИ есть ли способ передать Model.Data.Id в мою функцию, чтобы я мог вместо этого просто использовать id?

Ответы [ 3 ]

13 голосов
/ 09 марта 2012

Предложение Where возвращает итератор.Выберите то, что вы хотите использовать вместо.Т.е., если вы ожидаете только один результат, вы можете использовать FirstOrDefault.Вы также можете использовать индекс, например [1].

var appt = (Appointment)Application.Appointments.Where
     (a=>a.Id.Equals(collection["Id"]))
     .FirstOrDefault();

Обратите внимание, что FirstOrDefault возвращает null, когда предмет не найден, поэтому обязательно проверьте значение результата.

PS: вам, вероятно, не нужен ваш составтам.Без (Appointment, из-за ошибки в вашем заголовке, это должно сработать, потому что элементы в списке имеют тип Appointment.

1 голос
/ 14 июня 2012

Это то, что я в итоге использовал, и это сработало.

var appt = Application.Session.GetObjectFromOid<Appointment>(new ObjectId(id));
0 голосов
/ 15 июня 2012

При работе с операторами LINQ следует помнить одну вещь - те, которые в любом случае возвращают ноль или более элементов - это то, что они возвращают объект, который может быть присвоен IEnumerable.

  • Если вы ожидаете один элемент, вам нужно будет добавить еще один оператор LINQ. Single и SingleOrDefault оба возвращают один результат. Это исключение броска, если найдено более 1 совпадения.

  • Операторы LINQ First и FirstOrDefault также возвращают также один элемент, просто для исключения, если существует более 1 совпадение, они просто возвращают первый найденный элемент.

В любом случае, если совпадений не найдено, операторы "OrDefault" возвращают ноль, но другие два выдают исключение.

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