2011-09-09 34 views
6
/// <summary> 
/// Returns list of popular searches 
/// </summary> 
public static string[] getPopularSearches(int SectionID, int MaxToFetch) 
{ 
    using (MainContext db = new MainContext()) 
    { 
     return (from c in db.tblSearches where c.SectionID == SectionID && c.Featured select new[] { c.Term }); 
    } 
} 

Miré a otras preguntas, pero que parecen ser ligeramente diferente, me sale el error:LINQ retorno matriz de cadenas

Cannot implicitly convert type 'System.Linq.IQueryable<string[]>' to 'string[]' 

Sé que esto es probablemente simple, es posible que alguien señalar lo que está mal aquí, por favor ?

+0

¿Hay algún motivo especial por el que deba devolver una matriz? IEnumerable sería preferible en la mayoría de los casos, a menos que el código de llamada requiera específicamente una matriz (improbable) – MattDavey

Respuesta

15

Claro - Está tratando de regresar de un método declarado para devolver un string[], pero está devolviendo un consulta - que no es una cadena en sí misma. La forma más sencilla de convertir una consulta en una matriz es llamar al método de extensión ToArray.

Sin embargo, como ya está seleccionando una matriz de cadenas para cada elemento en la consulta, que en realidad devolvería string[][]. Sospecho que realmente desea seleccionar una sola cadena por elemento de consulta, y luego convertir todo el asunto en una matriz, es decir, un código como éste:

public static string[] GetPopularSearches(int sectionID, int maxToFetch) 
{ 
    using (MainContext db = new MainContext()) 
    { 
     var query = from c in db.tblSearches 
        where c.SectionID == sectionID && c.Featured 
        select c.Term; 
     return query.Take(maxToFetch) 
        .ToArray(); 
    } 
} 

Tenga en cuenta que:

  • he rebautizado método y parámetros que se ajustan a las convenciones de nomenclatura .NET
  • he añadido una llamada a Take con el fin de utilizar el parámetro maxToFetch
+0

Impresionante como siempre, gracias: D –

+3

Hola Jon, hice una foto para ti :) http: // i .stack.imgur.com/4CSKh.png –

4

Está intentando devolver una consulta no materializada. La consulta solo se evalúa cuando se enumera. Afortunadamente para usted, el método ToArray le quita la pena de enumerar y almacenar. Simplemente agregarlo al final de su consulta debe arreglar todo.

return (
    from c in db.tblSearches 
    where c.SectionID == SectionID && c.Featured 
    select new[] { c.Term } 
).ToArray(); 

EDITAR

Observando con mayor detenimiento, quizás:

return (
    from c in db.tblSearches 
    where c.SectionID == SectionID && c.Featured 
    select new[] { c.Term } 
).SelectMany(x => x).ToArray(); 

para aplanar los resultados de la consulta, o incluso (menos redundante):

return (
    from c in db.tblSearches 
    where c.SectionID == SectionID && c.Featured 
    select c.Term 
).ToArray(); 
+0

Si quisiera dos campos, no solo c.Term, ¿qué aspecto tendría? –

+0

@AlanFisher Puede seleccionar un objeto anónimo: '... seleccione nuevo {c.Term, c.SectionID}' – spender

0

Agregar. ToArray() al final de la declaración de devolución.

Cuestiones relacionadas