2011-09-09 33 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 }); 
    } 
} 

ho guardato le altre domande, ma sembrano essere leggermente diverso, ottengo l'errore:Linq ritorno array di stringhe

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

So che questo è probabilmente semplice, qualcuno potrebbe indicare che cosa c'è che non va qui per favore ?

+0

C'è un motivo particolare per cui è necessario restituire un array? IEnumerable sarebbe preferibile nella maggior parte dei casi, a meno che il codice chiamante richiede espressamente un array (improbabile) – MattDavey

risposta

15

Certo - stai cercando di tornare da un metodo dichiarato per restituire un string[], ma stai restituendo un query - che non è una stringa in sé. Il modo più semplice per convertire una query in una matrice è chiamare il metodo di estensione ToArray.

Tuttavia, come si è già selezionando un array di stringhe per ogni elemento nella query, che sarebbe in realtà tornare string[][]. Ho il sospetto che davvero si vuole selezionare una singola stringa di ogni elemento di query e quindi convertire il tutto in un array, vale a dire il codice come questo:

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(); 
    } 
} 

Nota che:

  • ho ribattezzato metodo e parametri per abbinare le convenzioni di denominazione NET
  • ho una chiamata a Take al fine di utilizzare il parametro maxToFetch
+0

Impressionante come sempre grazie: D –

+3

Hey Jon ho fatto una foto per voi :) http: // i .stack.imgur.com/4CSKh.png –

4

Si sta tentando di restituire una query unmaterialized. La query viene valutata solo quando viene enumerata. Fortunatamente per voi, il metodo ToArray elimina il dolore dall'enumerazione e dall'archiviazione. Aggiungerlo semplicemente alla fine della tua query dovrebbe risolvere tutto.

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

EDIT

Guardando più in dettaglio, forse:

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

appiattire i risultati della tua ricerca, o anche (meno ridondante):

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

Se volevo due campi, non solo c.Term, che cosa sarebbe che sembrano? –

+0

@AlanFisher È possibile selezionare un oggetto anonimo: '... selezionare nuova {c.Term, c.SectionID}' – spender

0

Aggiungi. ToArray() alla fine dell'istruzione return.