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

[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?

5
caradrye 9 Мар 2012 в 02:19

3 ответа

Лучший ответ

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

var appt = Application.Session.GetObjectFromOid<Appointment>(new ObjectId(id));
1
caradrye 14 Июн 2012 в 16:26

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

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

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

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

14
Abel 8 Мар 2012 в 22:23

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

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

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

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

0
Christopher Stevenson 14 Июн 2012 в 23:19