Практическое руководство. Как прямо выполнять запросы SQLHow to: Directly Execute SQL Queries

Технология LINQ to SQLLINQ to SQL преобразует написанные пользователем запросы в параметризованные запросы SQL (в текстовой форме) и отправляет их на сервер SQL для обработки.LINQ to SQLLINQ to SQL translates the queries you write into parameterized SQL queries (in text form) and sends them to the SQL server for processing.

В SQL не может выполняться все разнообразие методов, локально доступных приложению.SQL cannot execute the variety of methods that might be locally available to your application. LINQ to SQLLINQ to SQL пытается преобразовать эти локальные методы в равноценные операторы и функции среды SQL.tries to convert these local methods to equivalent operations and functions that are available inside the SQL environment. Большинство методов и операторов на .NET Framework встроенных типах имеют прямой перевод команд SQL.Most methods and operators on .NET Framework built-in types have direct translations to SQL commands. Некоторые методы и операторы можно создать из доступных функций,Some can be produced from the functions that are available. а те, которые не могут быть преобразованы, вызывают исключения во время выполнения.Those that cannot be produced generate run-time exceptions. Дополнительные сведения см. в разделе Сопоставление типов SQL-CLR.For more information, see SQL-CLR Type Mapping.

В тех случаях, когда запроса LINQ to SQLLINQ to SQL недостаточно для выполнения специализированной задачи, можно использовать метод ExecuteQuery для выполнения запроса SQL и последующего преобразования результата запроса непосредственно в объекты.In cases where a LINQ to SQLLINQ to SQL query is insufficient for a specialized task, you can use the ExecuteQuery method to execute a SQL query, and then convert the result of your query directly into objects.

ПримерExample

В следующем примере предполагается, что данные для класса Customer распределены по двум таблицам (customer1 и customer2).In the following example, assume that the data for the Customer class is spread over two tables (customer1 and customer2). Запрос возвращает последовательность объектов Customer.The query returns a sequence of Customer objects.

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 SQLLINQ to SQL создает объекты из любого SQL запроса.As long as the column names in the tabular results match column properties of your entity class, LINQ to SQLLINQ to SQL creates your objects out of any SQL query.

ПримерExample

Метод ExecuteQuery также допускает использование параметров.The ExecuteQuery method also allows for parameters. Для выполнения параметризованного запроса используется код, аналогичный представленному ниже.Use code such as the following to execute a parameterized query.

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().The parameters are expressed in the query text by using the same curly notation used by Console.WriteLine() and String.Format(). String.Format()Фактически вызывается в предоставленной вами строке запроса, заменяя заключенные в фигурные скобки параметры созданными именами параметров, такими как @p0 , @p1 ..., @p (n).In fact, String.Format() is actually called on the query string you provide, substituting the curly braced parameters with generated parameter names such as @p0, @p1 …, @p(n).

См. также разделSee also