Como: executar consultas SQL diretamenteHow to: Directly Execute SQL Queries

O LINQ to SQLLINQ to SQL converte as consultas que você escreve em consultas SQL parametrizadas (em formato de texto) e as envia para o SQL Server para processamento.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.

O SQL não pode executar a variedade de métodos que podem estar disponíveis localmente para seu aplicativo.SQL cannot execute the variety of methods that might be locally available to your application. O LINQ to SQLLINQ to SQL tenta converter esses métodos locais em operações e funções equivalentes que estão disponíveis no ambiente SQL.LINQ to SQLLINQ to SQL tries to convert these local methods to equivalent operations and functions that are available inside the SQL environment. A maioria dos métodos e operadores em .NET Framework tipos internos têm traduções diretas para comandos SQL.Most methods and operators on .NET Framework built-in types have direct translations to SQL commands. Alguns podem ser gerados das funções que estão disponíveis.Some can be produced from the functions that are available. Aqueles que não podem ser produzidos geram exceções em tempo de execução.Those that cannot be produced generate run-time exceptions. Para obter mais informações, consulte mapeamento de tipo SQL-CLR.For more information, see SQL-CLR Type Mapping.

Nos casos em que uma consulta de LINQ to SQLLINQ to SQL é insuficiente para uma tarefa especializada, você pode usar o método ExecuteQuery para executar uma consulta SQL e, depois, converter o resultado da consulta diretamente em objetos.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.

ExemploExample

No exemplo a seguir, suponha que os dados da classe Customer são espalhados em duas tabelas (customer1 e customer2).In the following example, assume that the data for the Customer class is spread over two tables (customer1 and customer2). A consulta retorna uma sequência de objetos 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")

Desde que os nomes de coluna nos resultados de tabela correspondam às propriedades da coluna de sua classe de entidade, o LINQ to SQLLINQ to SQL cria seus objetos fora de qualquer consulta 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.

ExemploExample

O método ExecuteQuery também permite parâmetros.The ExecuteQuery method also allows for parameters. Use um código como o mostrado a seguir para executar uma consulta parametrizada.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'")

Os parâmetros são expressos no texto da consulta usando as mesmas chaves usadas por Console.WriteLine() e String.Format().The parameters are expressed in the query text by using the same curly notation used by Console.WriteLine() and String.Format(). Na verdade, String.Format() é realmente chamado na cadeia de caracteres de consulta que você fornece, substituindo os parâmetros de chaves com nomes de parâmetro gerados, como @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).

Veja tambémSee also