2010-08-04 54 views
24

que tienen un método:No se puede convertir implícitamente el tipo 'System.Linq.IQueryable' a 'System.Collections.Generic.IList'

public DzieckoAndOpiekunCollection GetChildAndOpiekunByFirstnameLastname(string firstname, string lastname) 
{ 
    DataTransfer.ChargeInSchoolEntities db = new DataTransfer.ChargeInSchoolEntities(); 
    DzieckoAndOpiekunCollection result = new DzieckoAndOpiekunCollection(); 
    if (firstname == null && lastname != null) 
    { 
     IList<DzieckoAndOpiekun> resultV = from p in db.Dziecko 
         where lastname == p.Nazwisko 
         **select** new DzieckoAndOpiekun(
        p.Imie, 
        p.Nazwisko, 
        p.Opiekun.Imie, 
        p.Opiekun.Nazwisko) 
        ; 
     result.AddRange(resultV); 
    } 
    return result; 
} 

y error en su lugar seleccionado:

de error 1 No se puede convertir implícitamente el tipo 'System.Linq.IQueryable <WcfService1.DzieckoAndOpiekun>' en 'System.Collections.Generic.IList <WcfService1.DzieckoAndOpiekun>'. Existe una conversión explícita (¿falta un molde?)

¿Alguna idea de cómo resolver mi problema?

Respuesta

44

Para convertir IQuerable o IEnumerable a una lista, puede hacer uno de los siguientes:

IQueryable<object> q = ...; 
List<object> l = q.ToList(); 

o:

IQueryable<object> q = ...; 
List<object> l = new List<object>(q); 
+1

Solución ideal, Tnx !! :) – netmajor

+0

Por supuesto, la extensión '.ToArray()' Linq también podría usarse en este caso (porque un 'T []' es un 'IList ' también). Pero, ¿qué requiere el método 'AddRange'? Tal vez podría simplemente usar 'var' (lo que significaría' IQueryable 'aquí), y' AddRange' estaría contento con eso? Nota: 'IQueryable <>' hereda 'IEnumerable <>'. –

3

probar este ->

new DzieckoAndOpiekun(
         p.Imie, 
         p.Nazwisko, 
         p.Opiekun.Imie, 
         p.Opiekun.Nazwisko).ToList() 
+0

.ToList() funcionará correctamente si lo estoy usando .Tomar (2) en su lugar. Lanzará el mismo error – manny

2

Usted puede utilizar el método .ToList() para convertir el resultado IQueryable volvió a un IList, como se muestra a continuación, después de la consulta LINQ.

public DzieckoAndOpiekunCollection GetChildAndOpiekunByFirstnameLastname(string firstname, string lastname) 
{ 
    DataTransfer.ChargeInSchoolEntities db = new DataTransfer.ChargeInSchoolEntities(); 
    DzieckoAndOpiekunCollection result = new DzieckoAndOpiekunCollection(); 
    if (firstname == null && lastname != null) 
    { 
     IList<DzieckoAndOpiekun> resultV = from p in db.Dziecko 
         where lastname == p.Nazwisko 
         **select** new DzieckoAndOpiekun(
        p.Imie, 
        p.Nazwisko, 
        p.Opiekun.Imie, 
        p.Opiekun.Nazwisko).ToList() 
        ; 
     result.AddRange(resultV); 
    } 
    return result; 
} 
+0

Tengo entonces el error: Error 'WcfService1.DzieckoAndOpiekun' no contiene una definición para 'ToList' y no se pudo encontrar ningún método de extensión 'ToList' que aceptara un primer argumento de tipo 'WcfService1.DzieckoAndOpiekun' (¿Echas en falta una directiva de uso o una referencia de ensamblaje?) – netmajor

10

Puede reemplazar IList<DzieckoAndOpiekun> resultV con var resultV.

+3

Esta es una respuesta mucho mejor que las demás. Especialmente si 'AddRange()' acepta un 'IEnumerable ' (que casi seguro lo haría ...) –

+0

Perfecto, súper simple. ¡Gracias! –

3

Si usa una cláusula where, asegúrese de incluir .First() si no desea un objeto IQueryable.

+0

gracias esto ayudó con un problema similar que estaba teniendo – mgrenier

1

Tengo resuelto mi problema de esta manera en la FE en la lista de registros de db

ListOfObjectToBeOrder.OrderBy(x => x.columnName).ToList(); 
Cuestiones relacionadas