Практическое руководство. Непосредственное выполнение запросов 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).