Поделиться через


Практическое руководство. Непосредственное выполнение запросов SQL

LINQ to SQL преобразует запросы, которые вы записываете в параметризованные SQL-запросы (в текстовой форме) и отправляет их на СЕРВЕР SQL server для обработки.

В SQL не может выполняться все разнообразие методов, локально доступных приложению. LINQ to SQL пытается преобразовать эти локальные методы в эквивалентные операции и функции, доступные в среде SQL. Большинство методов и операторов в платформа .NET Framework встроенных типов имеют прямые переводы в команды SQL. Некоторые методы и операторы можно создать из доступных функций, а те, которые не могут быть преобразованы, вызывают исключения во время выполнения. Дополнительные сведения см. в разделе "Сопоставление типов SQL-CLR".

В случаях, когда для специализированной задачи недостаточно запроса LINQ to SQL, можно использовать ExecuteQuery метод для выполнения SQL-запроса, а затем преобразовать результат запроса непосредственно в объекты.

Пример 1

В следующем примере предполагается, что данные для класса Customer распределены по двум таблицам (customer1 и customer2). Запрос возвращает последовательность объектов Customer.

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")

Если имена столбцов в табличных результатах соответствуют свойствам столбца класса сущности, LINQ to SQL создает объекты из любого ЗАПРОСА SQL.

Пример 2

Метод ExecuteQuery также допускает использование параметров. Для выполнения параметризованного запроса используется код, аналогичный представленному ниже.

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'")

Параметры записываются в тексте запроса с помощью той же нотации с фигурными скобками, которая используется в методах Console.WriteLine() и String.Format(). Фактически вызывается в предоставленной строке запроса, String.Format() заменяя фигурные параметры с созданными именами параметров, например @p0, @p1 ..., @p(n).

См. также