Frage

Ich versuche, nur ein paar Spalten aus einem LINQ to SQL-Abfrage zurückgeben, aber wenn ich es tue, wirft es die Ausnahme:

Explicit Bau von Entitätstyp InVision.Data.Employee 'in Abfrage ist nicht erlaubt

Hier ist der Code:

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

Wenn ich alles zurückgeben, dann wird es Ausnahmen über zirkuläre Referenzen zu werfen, weil es serialisiert werden muss, um in JavaScript verwendet werden, so brauche ich wirklich die Spalten ... Dank Begrenzung für alle Tipps, die Sie mir, dies zu lösen geben.

War es hilfreich?

Lösung

Grundsätzlich, wenn Sie nur die Spalten möchten, wählen Sie diese. Wenn Sie die Mitarbeiter Einheit wollen, wählen Sie es. Es gibt nicht viel von einem Mittelweg hier. Ich empfehle gegen eine neue Klasse nur für diese zu schaffen. Igitt!

Tun Sie dies:

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

Andere Tipps

Weil ich habe mit Linq2Sql und Serialisierung zu kämpfen, bevor ich dieses Szenario eines View-Objekt verwenden würde empfehlen, zu behandeln, anstatt eine Linq2Sql Entity. Es ist eine viel einfachere Lösung:

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

Die andere Alternative ist es, eine neue Kopie der Employee-Tabelle in den DBML Designer zu ziehen, nennen Sie es etwas anderes wie SimpleEmployee, löschen Sie alle Beziehungen und entfernen Sie alle Spalten, die Sie nicht benötigen.

Justin,

Erläuterung dieser Fehler hier: http: // devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx

Eine Sache, die Sie tun können, ist eine Klasse, die aus den Mitarbeitern derrives.

public class EmployeeProxy : Employee
{
}

, dann können Sie Ihre Anfrage tun:

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

Auf der anderen Seite, wenn Sie nur das Ergebnis zu javascript serialisiert benötigen, dann können Sie auch nur anonyme Klassen verwenden. Dies funktioniert auch:

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

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top