Udostępnij za pośrednictwem


Instrukcje: Bezpośrednie wykonywanie zapytań SQL

LINQ to SQL tłumaczy zapytania zapisywane w sparametryzowanych zapytaniach SQL (w postaci tekstowej) i wysyła je do serwera SQL na potrzeby przetwarzania.

Program SQL nie może wykonać różnych metod, które mogą być dostępne lokalnie dla aplikacji. LinQ to SQL próbuje przekonwertować te metody lokalne na równoważne operacje i funkcje, które są dostępne w środowisku SQL. Większość metod i operatorów w wbudowanych typach programu .NET Framework ma bezpośrednie tłumaczenia poleceń SQL. Niektóre można wygenerować na podstawie dostępnych funkcji. Te, których nie można wygenerować, generują wyjątki w czasie wykonywania. Aby uzyskać więcej informacji, zobacz Mapowanie typów SQL-CLR.

W przypadkach, gdy zapytanie LINQ to SQL jest niewystarczające dla wyspecjalizowanego zadania, można użyć ExecuteQuery metody do wykonania zapytania SQL, a następnie przekonwertować wynik zapytania bezpośrednio na obiekty.

Przykład 1

W poniższym przykładzie przyjęto założenie, że dane klasy Customer są rozłożone na dwie tabele (customer1 i customer2). Zapytanie zwraca sekwencję Customer obiektów.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
IEnumerable<Customer> results = db.ExecuteQuery<Customer>
(@"SELECT c1.custid as CustomerID, c2.custName as ContactName
    FROM customer1 as c1, customer2 as c2
    WHERE c1.custid = c2.custid"
);
Dim db As New Northwnd("c:\northwnd.mdf")
Dim results As IEnumerable(Of Customer) = _
    db.ExecuteQuery(Of Customer) _
    ("SELECT c1.custID as CustomerID," & _
    "c2.custName as ContactName" & _
    "FROM customer1 AS c1, customer2 as c2" & _
    "WHERE c1.custid = c2.custid")

Tak długo, jak nazwy kolumn w wynikach tabelarycznych pasują do właściwości kolumny klasy jednostki, LINQ to SQL tworzy obiekty z dowolnego zapytania SQL.

Przykład 2

Metoda ExecuteQuery umożliwia również parametry. Użyj kodu, takiego jak poniżej, aby wykonać sparametryzowane zapytanie.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
IEnumerable<Customer> results = db.ExecuteQuery<Customer>
    ("SELECT contactname FROM customers WHERE city = {0}",
    "London");
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim results As IEnumerable(Of Customer) = _
db.ExecuteQuery(Of Customer) _
("SELECT contactname FROM customers WHERE city = {0}, 'London'")

Parametry są wyrażane w tekście zapytania przy użyciu tej samej notacji curly używanej przez Console.WriteLine() i String.Format(). W rzeczywistości String.Format() element jest wywoływany dla podanego ciągu zapytania, podstawiając nawiasy klamrowe z wygenerowanymi nazwami parametrów, takimi jak @p0, @p1 ..., @p(n).

Zobacz też