2016-03-23 10 views
0

Kontext: Ich habe eine Lösung mit 3 ProjektenEntity Framework 6 Projektion, POCO Einheit Rückgabetyp

Project.Db: mein DbContext/Repositorys
Project.Core Enthält: Enthält meine POCO Klassen (von der DbContext verwendet) .
Project.Web: Mein MVC-Projekt, das die Mapping-Klassen viewModels und POCO-ViewModel enthält.

Es scheint unmöglich zu sein, dass eine typisierte Projektion einen EF-Entitätstyp zurückgibt. In Project.Db habe ich die folgende Methode. Ich möchte zwei spezifische Felder (Name und ID) der Regionen und ihrer Unterregionen erhalten. Ich möchte nicht, dass das generierte T-SQL die unerwünschten Felder auswählt.

public List<Region> GetRegionsAndSubRegions(){ 
var regions = Context.Regions.Where(r => condition); 
var lightRegions = regions.Select(z => new Region{ 
             RegionName = z.RegionName, 
             RegionId = z.RegionId 
            }).ToList(); 
} 

Das bin ich den Fehler

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

Der Weg werde ich um diese zu bekommen ist gefunden:

var lightRegions = regions.ToList().Select(z => new Region{ 
             RegionName = z.RegionName, 
             RegionId = z.RegionId 
            }).ToList(); 

Doch die "ToList()" alle Felder auswählen was ich nicht will.

Ich könnte auf eine ViewModel-Klasse projizieren, aber ich möchte diese Abhängigkeit nicht in Project.Db. Die Methode sollte eine Liste meiner POCO-Entität zurückgeben (Liste <Region>).

Alle meine Repository-Methoden geben Core (POCO) typisierte Objekte an das Webprojekt zurück.

Gibt es eine Möglichkeit, dies zu tun, ohne auf einen anonymen Typ zu projizieren und ihn wieder dem Region-Typ zuzuordnen (was überflüssig wäre)? Danke

+0

Ich weiß nicht, wo Sie hinwollen, so Ich kann dich nicht in die richtige Richtung weisen. Es ist mir nicht klar, warum Sie diese teilweise erfüllten Entitäten brauchen. –

+0

Bearbeitet mit mehr Details – BenoitM

+0

Versuchen Sie diese Technik: http://stackoverflow.com/questions/12916080/the-entity-or-complex-type-cannot-be-constructed-in-a-linq-to-entities-abfrage –

Antwort

0

Es ist nicht möglich, einen EF-Entitätstyp in der Projektion direkt zu instanziieren. Ich denke, es soll Zweideutigkeiten verhindern, wie Gert sagte. Der einzige Weg, dies zu tun, ist Projekt anonymen Typ und dann auf den Entitätstyp zuordnen.

public List<Region> GetRegionsAndSubRegions(){ 
var regions = Context.Regions.Where(r => condition); 
var anonRegions = regions.Select(r => new { 
            RegionName = r.RegionName, 
            RegionId = r.RegionId 
           }).ToList(); 
var lightRegions = anonRegions.Select(r => new Region{ 
            RegionName = r.RegionName, 
            RegionId = r.RegionId 
           }).ToList(); 
} 

Natürlich ist das ein Schmerz im Nacken und wird hässlich schnell mit vielen Tabellenbeziehungen.

1

Es ist möglich. Ich habe es nur mit
<package id="EntityFramework" version="6.1.3" targetFramework="net461" />

ein Fahrzeug (30 + Felder in Modell & db) ist auf eine StatisticsVehicle projiziert.

Meine Suche:

var vehicles = 
    _context.Vehicles 
     .Select(v => 
      new StatisticsVehicle() 
      { 
       PlateNumber = v.PlateNumber, 
       StatisticsVehicleProcesses = 
        v.VehicleProcesses.Select(vp => new StatisticsVehicleProcess() 
        { 
         EffectiveIssuanceDate = vp.EffectiveIssuanceDate, 
         PlannedIntakeEndDate = vp.PlannedIntakeEndDate 
        }) 
      } 
     ) 
     .ToList(); 

, die in einer SQL-Abfrage-Ergebnisse nur die Felder, die Auswahl ich von diesem Fahrzeug und vehicleprocess brauchen:

SELECT 
    [Project2].[Id] AS [Id], 
    [Project2].[C1] AS [C1], 
    [Project2].[PlateNumber] AS [PlateNumber], 
    [Project2].[C2] AS [C2], 
    [Project2].[EffectiveIssuanceDate] AS [EffectiveIssuanceDate], 
    [Project2].[PlannedIntakeEndDate] AS [PlannedIntakeEndDate] 
    FROM ... 
Verwandte Themen