2011-03-31 16 views
8

Estoy construyendo una página que muestra un resultado de consulta LINQ como una tabla.No se puede convertir la expresión lambda para escribir 'cadena' porque no es un tipo de delegado

  1. Configure la consulta base en el método 'SetupArticleQuery()' que guarda la consulta en 'this.articles'.
  2. Ejecute otro método, 'UpdateFilter()' para filtrar los resultados que se guardan en 'this.articles'.

me sale el error

No se puede convertir la expresión lambda al tipo 'cadena' porque no es un tipo de delegado

en la línea con el código

this.articles = from art in this.articles 
       where art.category_id == this.categoryId 
       select art; 

¿Alguna idea de cómo corregir el código a continuación?

namespace WebApplication3 { 
    public partial class _Default : System.Web.UI.Page { 
     private IQueryable articles; 

     protected void Page_Load(object sender, EventArgs e) { 
      this.SetupArticleQuery(); 
      this.UpdateFilter(); 
     } 

     private void SetupArticleQuery() { 
      this.articles = from a in KB.Articles 
          join t in KB.Teams on a.primary_team_id equals t.id 
          join cat in KB.Categories on a.category_id equals cat.id 
          join scat in KB.SubCategories on a.subcategory_id equals scat.id 
          join top in KB.Topics on a.topic_id equals top.id 
          select new { 
           a.id, 
           a.title, 
           a.view_count, 
           a.created_at, 
           a.created_by, 
           a.primary_team_id, 
           primary_team_name = t.name, 
           category_id = cat.id, 
           category_name = cat.name, 
           subcategory_id = scat.id, 
           subcategory_name = scat.name, 
           topic_id = top.id, 
           topic_name = top.name 
          }; 
     } 

     private void UpdateFilter() { 
      if (this.categoryId > 0) { 
       this.articles = from art in this.articles 
           where art.category_id == this.categoryId 
           select art; 

      } 
     } 
} 
+0

Tuve el mismo problema porque simplemente me faltaba el uso de System.Linq; – markmnl

Respuesta

5

Esta consulta:

this.articles = from a in KB.Articles 
       join t in KB.Teams on a.primary_team_id equals t.id 
       join cat in KB.Categories on a.category_id equals cat.id 
       join scat in KB.SubCategories on a.subcategory_id equals scat.id 
       join top in KB.Topics on a.topic_id equals top.id 
       select new { 
        a.id, 
        a.title, 
        a.view_count, 
        a.created_at, 
        a.created_by, 
        a.primary_team_id, 
        primary_team_name = t.name, 
        category_id = cat.id, 
        category_name = cat.name, 
        subcategory_id = scat.id, 
        subcategory_name = scat.name, 
        topic_id = top.id, 
        topic_name = top.name 
       }; 

no funcionará como esto ya que devuelve un tipo anónimo. Como resultado, debe escribirlo como var, que no es válido para los miembros de nivel de clase; solo puedes usar var para variables locales.

Lo que hay que hacer es crear una clase real para mantener su proyección, y tener algo como:

... 
join top in KB.Topics on a.topic_id equals top.id 
select new LocalDTO() 
{ 
    id = a.id, 
    ... 
}; 

Desde allí se puede simplemente tener:

private void UpdateFilter() 
{ 
    if (this.categoryId > 0) 
     this.articles = this.articles.Where(a => art.category_id); 
} 

Y por supuesto esto. los artículos se declararán como IQueryable<LocalDTO>.

1

Si se trata de un problema con tipos anónimos, ¿puedes hacer algo como esto?

private void UpdateFilter() { 
    if (this.categoryId > 0) { 
     this.articles = this.articles.Where(a => a.category_id == this.categoryId).AsQueryable(); 
    } 
} 

Esto puede estar fuera de base, ya que la lambda subyacente es la misma.

+0

Probé ese también, pero recibí el mismo mensaje de error. – Damiro

13

Actualmente no he encontrado ningún problema en su código.

De esta answer, sugeriría que confirmar que ha agregado:

Using System.Linq; 

Buena suerte!

+0

thx, ¡salvaste el día! –

28

Tuve que agregar lo siguiente para que este error desapareciera.

using System.Data; 
using System.Data.Entity; 
+1

salvó mi tiempo gracias por la solución – bhargav

+0

Impresionante: esta fue la solución exacta. ¡Gracias! – Doug

Cuestiones relacionadas