The entity or complex type cannnot be constructed in a LINQ to Entities query

In some cases it is necessary read form a table and return a different type. A typical cases is if you read from a base table but you wanna return the view class and not the table class mapped by Entity Framework.

If you try to it, you’ll get this error:
The entity or complex type cannnot be constructed in a LINQ to Entities query

// Error because we try to re-use a class mapped by EF
public IList<V_TAB_ANAGRAFICA> SelectResp() 
{
    var q = from a in this.TAB_ANAGRAFICA
        where a.ID_AUTORIZZATORE.HasValue
        select new V_TAB_ANAGRAFICA
        {
            ID_ANAGRAFICA = a.ID_AUTORIZZATORE.Value,
            NOME = a.NOMEAUTORIZZATORE,
            COGNOME = a.COGNOMEAUTORIZZATORE,
            COGNOMENOME = a.COGNOMENOMEAUTORIZZATORE,
            COD_GECOSE = a.COD_GECOSE,
            GECOSE = a.GECOSE
        };
 
    return q.ToList();
}

Solution 1

Create a DTO Class like this:

class V_TAB_ANAGRAFICA_DTO : TAB_ANAGRAFICA {}

public IList<V_TAB_ANAGRAFICA> SelectResp() 
{
    var q = from a in this.TAB_ANAGRAFICA
        where a.ID_AUTORIZZATORE.HasValue
        select new V_TAB_ANAGRAFICA_DTO
        {
            ID_ANAGRAFICA = a.ID_AUTORIZZATORE.Value,
            NOME = a.NOMEAUTORIZZATORE,
            COGNOME = a.COGNOMEAUTORIZZATORE,
            COGNOMENOME = a.COGNOMENOMEAUTORIZZATORE,
            COD_GECOSE = a.COD_GECOSE,
            GECOSE = a.GECOSE
        };
 
    return q.ToList();
}

This solution works and it is fast, but it will introduce an additional class, and sincerely I don’t like it.

Solution 2

Recover the entities from DB and load them into memory using .AsEnumerable() than use linq to Enty (not Entity Framework) to select what we want.
This solution doesn’t need another class BUT it is slower than the first solution because we do a select in memory to re-map the item in another class.
Probably this is not a problem but It could be with a great amount of data.

public IList<V_TAB_ANAGRAFICA> SelectResp() 
{
    var q = from a in this.TAB_ANAGRAFICA
        where a.ID_AUTORIZZATORE.HasValue
        select a;
    var q1 = q.AsEnumerable().Select( a =>
        new V_TAB_ANAGRAFICA
        {
            ID_ANAGRAFICA = a.ID_AUTORIZZATORE.Value,
            NOME = a.NOMEAUTORIZZATORE,
            COGNOME = a.COGNOMEAUTORIZZATORE,
            COGNOMENOME = a.COGNOMENOMEAUTORIZZATORE,
            COD_GECOSE = a.COD_GECOSE,
            GECOSE = a.GECOSE
        });
 
    return q1.ToList();
}
Annunci

Informazioni su Andrea Regoli

Project Manager .Net Developer WPF WP7 Asp.Net c# javascript ajax SQL sharepoint
Questa voce è stata pubblicata in .Net, c#, Entity Framework e contrassegnata con . Contrassegna il permalink.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...