2012-03-08 168 views
5

Este es un fragmento de código de mi controladorNo se puede convertir objeto de tipo 'WhereListIterator`1 [Web.Model.Appointment]' al tipo 'Web.Model.Appointment'

[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"])); 
    ..... 
} 

Este es el error que Obtengo: no se puede convertir el objeto del tipo 'WhereListIterator`1 [Web.Model.Appointment]' para escribir 'Web.Model.Appointment'.

Este es mi punto de vista:

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

y este es mi función

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

    }); 
    } 

Entonces, ¿por qué recibo este error? O ¿hay alguna manera de pasar Model.Data.Id a mi función para que yo pueda simplemente usar id en su lugar?

Respuesta

1

Esto es lo que terminé usando y funcionó.

var appt = Application.Session.GetObjectFromOid<Appointment>(new ObjectId(id)); 
12

La cláusula Where devuelve un iterador. Seleccione lo que quiere usar en su lugar. Es decir, si espera un solo resultado, puede usar FirstOrDefault. También puede usar un índice, como [1].

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

Tenga en cuenta que los rendimientos FirstOrDefaultnull cuando no se encuentra el artículo, así que asegúrese de comprobar el valor del resultado.

PD: probablemente no necesites tu yeso allí. Sin (Appointment, a partir del error en su título, esto debería funcionar, porque los elementos en la lista son de tipo Appointment.

0

Una cosa a tener en cuenta cuando se trabaja con los operadores LINQ - los que devuelven cero o más elementos, de todos modos - es que devuelven un objeto que se puede asignar a IEnumerable.

  • Si está esperando un elemento único, o bien deberá agregar otro operador LINQ. Single y SingleOrDefault ambos devuelven un solo resultado. Estos arrojan excepciones cuando hay MÁS de 1 partido.

  • Los operadores de LINQ Primero y Primero O por Defecto también devuelven un único elemento también, simplemente ese insead de lanzar una excepción si hay más de 1 coincidencia, simplemente devuelven el primero encontrado.

En cualquiera de los casos, si no se encuentra una coincidencia los operadores "OrDefault" devuelven un nulo, pero los otros dos una excepción.

Cuestiones relacionadas