作法:直接執行 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))。

另請參閱