2015-07-02 10 views
6

Ich möchte aus Datenbank komplexe Objekt mithilfe einzelner Abfrage abrufen. Schauen wir uns das folgende Beispiel aussehen:Abrufen komplexer Objekte durch Raw SQL-Abfrage in Entity Framework

SELECT TableA.*, TableB.* 
FROM TableA 
INNER JOIN TableA.B_Id = TableB.Id 

und entsprechenden Klassen:

public class QueryResult 
{ 
    public TableA A { get; set; } 
    public TableB B { get; set; } 
} 

public class TableA 
{ 
    public int Id { get; set; } 
    public string SomeContentA { get; set; } 
    public int B_Id { get; set; } 
} 

public class TableB 
{ 
    public int Id { get; set; } 
    public int SomeContentB { get; set; } 
} 

Ich möchte die rohen SQL-Abfrage von oben gegen die Datenbank auszuführen und bekommen Sammlung von queryresult mit A richtig eingestellt Objekte und B Eigenschaften. Bisher habe ich versucht, sqlquery Methode verwendet, aber ich schaffte es nur Sammlung von queryresult zu erhalten Objekte mit NULL-Werte in A- und B-Eigenschaften (scheinbar zurückErgebnisMenge wurde nicht richtig auf Eigenschaften binded):

var results = ctx.Database.SqlQuery<QueryResult>(\\example_query).ToList(); 

Beachten Sie, dass:

  • Ich sollte manuell Spalten in SELECT-Anweisung nicht auflisten. TableA- und TableB-Klassen sowie SQL-Tabellen ändern sich mit der Zeit wahrscheinlich, aber diese Änderungen sind konsistent.
  • Drei Abfragen (eine zum Abrufen von IDs aus TableA und TableB, zweite zum Abrufen von Objekten aus TableA, dritte für Objekte aus TableB) beeinträchtigen die Leistung, und ich sollte versuchen, sie möglichst zu vermeiden.

Ich bin mit Entity Framework 4.3 und SQL Server 2012

Danke, Art

+0

ist die 'B_Id' ein tatsächlicher Fremdschlüssel hier? Wenn ja, gibt es einen Grund, warum Sie nicht auf ein 'TableB' in Ihrer' TableA' verweisen, so dass Sie es einfach durch EF laden können, anstatt rohen SQL zu verwenden? – Thewads

+0

Nein, ist es nicht, ich habe es nur zu dem Beispiel hinzugefügt, um einen Join zu verwenden. Entschuldigung für die Verwirrung. Im tatsächlichen Problem gibt es keine Beziehung zwischen TableA und TableB und es gibt keine Option, den Code durch normale EF-Konstruktionen zu ersetzen. –

+0

Gibt es einen Grund für die Verwendung von EF4.x? Dachte ich über ein Upgrade auf 6.x nach? Haben Sie auch Zugriff auf einen SProc in der DB, um den komplexen Beitritt durchzuführen? – GoldBishop

Antwort

0

Sie noch regelmäßig EF Konstruktionen nur durch Abbildung Ihrer Klassen zu den entsprechenden Tabellen und zwingt die Verbindung in verwenden können LINQ-To-Instanzen:

using(var ctx = new MyDbContext()) 
{ 
    return ctx.TableA 
     .Join(ctx.TableB, a=>a.B_Id, b=>b.Id, (a,b)=> 
       new QueryResult{TableA=a, TableB=b}); 
} 

denke ich, das ist der einzige Weg, zumindest bis zu EF6.