2015-07-02 17 views
6

Chciałbym pobrać z obiektu złożonego bazy danych przy użyciu pojedynczego zapytania. Spójrzmy na poniższy przykład:Pobieranie złożonych obiektów przez surowe zapytanie SQL w Entity Framework

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

i odpowiednie ćwiczenia:

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

chciałbym wykonać zapytanie SQL surowca z góry w bazie danych i uzyskać zbiór queryResult obiekty z poprawnie ustawić i Właściwości B. Do tej pory próbowałem przy użyciu metody sqlquery, ale tylko udało się dostać zbiór queryResult obiektów z wartości null w A i właściwości B (podobno wrócił zestaw wynik nie został poprawnie binded do właściwości):

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

zauważyć, że:

  • Nie powinienem wystawiać ręcznie kolumn w instrukcji SELECT. Klasy TableA i TableB oraz tabele SQL prawdopodobnie z czasem ulegną zmianie, ale te zmiany będą spójne.
  • Trzy zapytania (jeden do pobrania identyfikatorów z TableA i TableB, drugi do pobrania obiektów z TableA, trzeci dla obiektów z TableB) zaszkodzi wydajności i powinienem spróbować tego uniknąć, jeśli to możliwe.

używam Entity Framework 4.3 oraz SQL Server 2012.

Dzięki, Art

+0

to "B_Id' Rzeczywisty klucz obcy tutaj? Jeśli tak, czy istnieje powód, dla którego nie odwołujesz się do 'TableB' w twoim' TableA', więc możesz po prostu załadować go przez EF, zamiast używać surowego SQL? – Thewads

+0

Nie, nie jest, właśnie dodałem go do przykładu, aby użyć sprzężenia. Przepraszam za zamieszanie. W rzeczywistym problemie nie ma związku między tabelą A i tabelą B, a nie ma możliwości zastąpienia kodu zwykłymi konstrukcjami EF. –

+0

Czy jest jakiś powód używania EF4.x? Myślisz o aktualizacji do wersji 6.x? Ponadto, czy masz dostęp do tworzenia SProc w DB, aby wykonać złożone połączenie? – GoldBishop

Odpowiedz

0

Można nadal używać zwykłych konstrukcji EF po prostu mapowania swoje klasy do odpowiednich tabel i zmuszając przyłączyć LINQ-to-Entity:

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

Myślę, że to jedyny sposób, przynajmniej do EF6.

Powiązane problemy