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
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
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. –
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