Come specificare quali colonne possono essere restituite dalla query linq a sql
-
06-07-2019 - |
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.
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.