2013-06-14 7 views
6

Ho un problema con la query di join con MVC e non so perché.Errore: impossibile strutturare l'entità o il tipo complesso in una query LINQ to Entities

The entity or complex type 'Tusofona_Website.Models.site_noticias' cannot be constructed in a LINQ to Entities query.

mio controller:

private TusofonaDBs db = new TusofonaDBs(); 

    // 
    // GET: /DestaquesMain/ 

    public ActionResult Index() 
    { 
     var query = (from sd in db.site_desquesnoticias 
        join sn in db.site_noticias on sd.IDNoticia equals sn.IDNoticia 
        where sn.Destaque == 1 
        select new site_noticias { 
         CorpoNoticia = sn.CorpoNoticia, 
         TituloNoticia = sn.TituloNoticia 
        }).ToList(); 

     //return View(db.site_desquesnoticias.ToList()); 
      return View(query); 

    } 

il mio modello:

public class site_destaquesnoticias 
{ 
    [Key] 
    public Int32 IDDestaque { get; set; } 
    public Int32 IDNoticia { get; set; } 
    public string Foto { get; set; } 


} 

public class site_noticias 
{ 
    [Key] 
    public Int32 IDNoticia { get; set; } 
    public string CorpoNoticia { get; set; } 
    public string TituloNoticia { get; set; } 
    public string Foto { get; set; } 
    public Int32 Destaque { get; set; } 
} 

public class TusofonaDBs : DbContext 
{ 
    public DbSet<site_destaquesnoticias> site_desquesnoticias { get; set; } 
    public DbSet<site_noticias> site_noticias { get; set; } 
} 

qualcuno mi può aiutare?

+0

Eventuali duplicati di [L'entità non può essere costruito in un LINQ to Entities interrogazione] (http://stackoverflow.com/questions/5325797/the-entity-cannot-be-constructed-in-a- linq-to-entities-query) –

risposta

14

Non è possibile proiettare su un'entità mappata (vedere la risposta this).

Tuttavia, si può fare un paio di cose:

1) Selezionare un tipo anonimo, invece di entità simile:

var query = (from sd in db.site_desquesnoticias 
        join sn in db.site_noticias on sd.IDNoticia equals sn.IDNoticia 
        where sn.Destaque == 1 
        select new { 
         CorpoNoticia = sn.CorpoNoticia, 
         TituloNoticia = sn.TituloNoticia 
        }).ToList(); 

2) Capovolgere la query per selezionare direttamente i site_noticias. Dipende dalla query e dai dati che vorresti recuperare. Ad esempio, si può avere uno sguardo se la seguente funzionerà e vi darà i dati di cui avete bisogno:

var query = (from sd in db.site_desquesnoticias 
        join sn in db.site_noticias on sd.IDNoticia equals sn.IDNoticia 
        where sn.Destaque == 1 
        select sn).ToList(); 

3) Utilizzare alcuni DTO (oggetto di trasferimento dati) per proiettare le proprietà che si desidera selezionare a :

public class SiteNoticiasDTO{ 
    public string CorpoNoticia {get;set;} 
    public string TituloNoticia {get;set;} 
    } 

var query = (from sd in db.site_desquesnoticias 
        join sn in db.site_noticias on sd.IDNoticia equals sn.IDNoticia 
        where sn.Destaque == 1 
        select new SiteNoticiasDTO { 
         CorpoNoticia = sn.CorpoNoticia, 
         TituloNoticia = sn.TituloNoticia 
        }).ToList(); 
+1

La 2) risposta funziona perfettamente. Probabilmente questo è un errore noob, sono ancora nuovo con MVC :). Grazie mille. – macieira

+0

Funziona, ma il risultato diventa non modificabile. Come si mantiene il risultato modificabile? Come foreach (item in query) {item.name = "append_something"; }. La modifica degli articoli non restituisce errori, ma non funziona. – doncadavona

+0

3 non ha funzionato per me come casting ProductDTO all'entità di prodotto richiesta restituisce errore: Impossibile eseguire il cast del tipo 'xyz.Controllers.ProductDTO' per digitare 'xyz.Models.Product'. LINQ to Entities supporta solo il casting di tipi primitivi o di enumerazione EDM. Devo restituire IQueriable al metodo di paging: esiste un modo per eseguire il cast dal DTO all'entità richiesta? – Luke

Problemi correlati