2013-06-14 10 views
6

Mam problem z zapytaniem o łączenie z MVC i nie wiem dlaczego.Błąd: encji lub typu złożonego nie można skonstruować w kwerendzie LINQ do Entities

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

My Kontroler:

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

    } 

Moja Model:

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

Ktoś może mi pomóc?

+0

Możliwe duplikat [jednostka nie może być wykonana w LINQ jednostkach zapytanie] (http://stackoverflow.com/questions/5325797/the-entity-cannot-be-constructed-in-a- linq-to-entity-query) –

Odpowiedz

14

Nie można rzutować na zmapowany obiekt (patrz odpowiedź this).

Można jednak zrobić kilka rzeczy:

1) Wybierz typ anonimowy zamiast podmiotu takiego:

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) Odwrócić zapytanie, aby wybrać bezpośrednio z site_noticias. To zależy od zapytania i danych, które chcesz odzyskać. Na przykład, można rzucić okiem, jeśli dalej będzie pracować i dać wam dane, które potrzebujesz:

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) Użyj trochę Dto (obiekt transferu danych) do projektu właściwości, które chcesz wybrać się na :

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

2) Odpowiedź działa dobrze. Prawdopodobnie jest to błąd noob, jestem jeszcze nowy z MVC :). Dziękuję bardzo. – macieira

+0

To działa, ale wynik staje się nieedytowalny. Jak zachować możliwość edycji wyników? Jak foreach (element w zapytaniu) {item.name = "append_something"; }. Edytowanie elementów nie zwraca żadnych błędów, ale nie działa. – doncadavona

+0

3 nie działa dla mnie jako odlewanie ProductDTO do potrzebnego zwrotu produktu jednostka błędu: Nie można odlać typu "xyz.Controllers.ProductDTO", aby wpisać "xyz.Models.Product". LINQ to Entities obsługuje tylko prymitywne lub wyliczeniowe typy EDM do rzutowania. Muszę zwrócić IQueriable do metody stronicowania: czy istnieje sposób, aby odrzucić z DTO do wymaganego podmiotu? – Luke

Powiązane problemy