Domanda

Sto cercando di restituire solo alcune colonne da una query linq a sql ma se lo faccio, genera l'eccezione:

La costruzione esplicita del tipo di entità "InVision.Data.Employee" nella query non è consentita

Ecco il codice:

return db.Employees.Select(e => new Employee()
       { EmployeeID = e.EmployeeID, FirstName = e.FirstName,
         LastName = e.LastName }).ToList();

Se restituisco tutto, genererà eccezioni sui riferimenti circolari perché deve essere serializzato per essere utilizzato in JavaScript, quindi ho davvero bisogno di limitare le colonne ... Grazie per tutti i suggerimenti che mi puoi dare per risolvere questo.

È stato utile?

Soluzione

Fondamentalmente, se vuoi solo le colonne, selezionale. Se si desidera l'entità dipendente, selezionarla. Non c'è molta via di mezzo qui. Sconsiglio di creare una nuova classe solo per questo. Yuck!

Fai questo:

return db.Employees
   .Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
   .ToList();

Altri suggerimenti

Perché ho dovuto combattere con Linq2Sql e la serializzazione prima di raccomandare di utilizzare un oggetto View per gestire questo scenario anziché un'entità Linq2Sql. È una soluzione molto più semplice:

return db.Employees
        .Select( e => new EmployeeView() 
        { 
            EmployeeID = e.EmployeeID, 
            FirstName = e.FirstName, 
            LastName = e.LastName 
         }).ToList();

L'altra alternativa è trascinare una nuova copia della tabella Employee nella finestra di progettazione DBML, denominarla in modo diverso come SimpleEmployee, eliminare tutte le relazioni e rimuovere tutte le colonne non necessarie.

Justin,

Spiegazione di questo errore qui: http: // devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx

Una cosa che puoi fare è creare una classe che derivi dal Dipendente.

public class EmployeeProxy : Employee
{
}

allora puoi fare la tua richiesta:

return db.Employees.Select(e => new EmployeeProxy { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();

D'altra parte, se devi solo serializzare il set di risultati su javascript, puoi anche usare solo classi anonime. Funziona anche così:

return db.Employees.Select(e => new { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top