Como: executar consultas SQL diretamente

LINQ 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.

O SQL não pode executar a variedade de métodos que podem estar disponíveis localmente para seu aplicativo. LINQ to SQL tenta converter esses métodos locais em operações e funções equivalentes que estão disponíveis no ambiente SQL. A maioria dos métodos e operadores nos tipos internos do .NET Framework têm conversões diretas para comandos SQL. Alguns podem ser gerados das funções que estão disponíveis. Aqueles que não podem ser produzidos geram exceções em tempo de execução. Para obter mais informações, consulte Mapeamento de tipo SQL-CLR.

Nos casos em que uma consulta de LINQ 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.

Exemplo 1

No exemplo a seguir, suponha que os dados da classe Customer são espalhados em duas tabelas (customer1 e customer2). A consulta retorna uma sequência de objetos 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")

Contanto que os nomes de coluna nos resultados tabulares coincidam com propriedades de coluna de sua classe de entidade, o LINQ to SQL criará seus objetos a partir de qualquer consulta SQL.

Exemplo 2

O método ExecuteQuery também permite parâmetros. Use um código como o mostrado a seguir para executar uma consulta parametrizada.

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(). Na verdade, String.Format() é chamado na cadeia de caracteres de consulta que você fornece, substituindo os parâmetros de chaves por nomes de parâmetros gerados, tais como @p0, @p1 …, @p(n).

Confira também