Procedura: eseguire direttamente query SQL

In LINQ to SQL le query create vengono convertite in query SQL con parametri, in formato testo, e inviate al server SQL per l'elaborazione.

Non è possibile eseguire in SQL la varietà di metodi eventualmente disponibili localmente per l'applicazione, Pertanto, LINQ to SQL tenta di convertire questi metodi locali nelle operazioni e funzioni equivalenti disponibili nell'ambiente SQL. Per la maggior parte dei metodi e degli operatori nei tipi .NET Framework incorporati sono disponibili conversioni dirette in comandi SQL. Alcuni possono essere prodotti dalle funzioni disponibili. Quelli che non possono essere prodotti generano eccezioni in fase di esecuzione. Per altre informazioni, vedere Mapping del tipo SQL-CLR.

Nei casi in cui una query LINQ to SQL fosse insufficiente per un'attività specializzata, è possibile usare il metodo ExecuteQuery per eseguire una query SQL, quindi convertire direttamente il risultato della query in oggetti.

Esempio 1

Nell'esempio seguente si supponga che i dati per la classe Customer siano distribuiti in due tabelle (customer1 e customer2). La query consente di restituire una sequenza di oggetti 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")

A condizione che i nomi di colonna nei risultati tabulari corrispondano alle proprietà di colonna della classe di entità, in LINQ to SQL verranno creati oggetti da qualsiasi query SQL.

Esempio 2

Il metodo ExecuteQuery accetta anche parametri. Per eseguire una query con parametri, usare codice analogo al seguente:

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

I parametri sono espressi nel testo della query usando la stessa notazione con parentesi graffe usata da Console.WriteLine() e String.Format(). String.Format() viene infatti chiamato nella stringa di query specificata, sostituendo i parametri tra parentesi graffe con nomi di parametro generati, ad esempio @p0, @p1…, @p(n).

Vedi anche