2015-07-02 14 views
6

Vorrei recuperare dall'oggetto complesso del database utilizzando una singola query. Diamo un'occhiata al seguente esempio:Recupero di oggetti complessi mediante query SQL non elaborata in Entity Framework

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

e classi corrispondenti:

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; } 
} 

Vorrei eseguire la query SQL prime dall'alto sul database e ottenere raccolta di QueryResult oggetti con impostato correttamente A e Proprietà B Finora ho provato ad utilizzare il metodo sqlquery, ma sono riuscito solo per ottenere la raccolta di QueryResult gli oggetti con valori nulli in A e le proprietà B (set di risultati apparentemente restituito non è stato binded correttamente per immobili):

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

notare che:

  • Non è consigliabile elencare le colonne manualmente nell'istruzione SELECT. È probabile che le tabelle TableA e TableB e le tabelle SQL cambino nel tempo, ma tali modifiche saranno coerenti.
  • Tre query (una per recuperare gli ID da TableA e TableB, la seconda per recuperare gli oggetti da TableA, la terza per gli oggetti da TableB) danneggerà le prestazioni e dovrei provare ad evitarlo se possibile.

sto utilizzando Entity Framework 4.3 e SQL Server 2012.

Grazie, arte

+0

è il 'B_Id' una chiave esterna reale qui? Se è così, c'è un motivo per cui non stai facendo riferimento a un 'TableB' nel tuo' TableA', quindi puoi caricarlo tramite EF, piuttosto che usare SQL raw? – Thewads

+0

No, non lo è, l'ho appena aggiunto all'esempio per usare un join. Dispiace per la confusione. Nel problema attuale non vi è alcuna relazione tra TableA e TableB e non vi è alcuna opzione per sostituire il codice con costruzioni EF regolari. –

+0

C'è un motivo per utilizzare EF4.x? Hai pensato di passare a 6.x? Inoltre, hai accesso per creare un SProc nel DB per eseguire l'unione complessa? – GoldBishop

risposta

0

È comunque possibile utilizzare le costruzioni EF regolari, semplicemente mappando le vostre classi ai loro corrispondenti tabelle e costringendo il join in LINQ to Entities:

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}); 
} 

Penso che questo sia l'unico modo, per lo meno fino a EF6.

Problemi correlati