如何:直接执行 SQL 查询

LINQ to SQL 将你编写的查询转换成参数化 SQL 查询(以文本形式),然后将其发送至 SQL 服务器进行处理。

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)。

请参阅