如何:直接执行 SQL 查询 (LINQ to SQL)

更新:November 2007

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

SQL 无法执行在本地可能对您的应用程序可用的各种方法。LINQ to SQL 会设法将这些本地方法转换成在 SQL 环境中可用的等效操作和函数。.NET Framework 内置类型中的大多数方法和运算符都能直接转换成 SQL 命令。有些则可以用可用的函数生成。无法生成的那些方法和运算符会产生运行时异常。有关更多信息,请参见 SQL-CLR 类型映射 (LINQ to SQL)

如果 LINQ to SQL 查询不足以满足专门任务的需要,您可以使用 ExecuteQuery 方法来执行 SQL 查询,然后将查询的结果直接转换成对象。

示例

在下面的示例中,假定 Customer 类的数据分布在两个表(customer1 和 customer2)中。此查询将返回 Customer 对象的序列。

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

只要表格结果中的列名与您的实体类的列属性匹配,LINQ to SQL 就会为您创建不在任何 SQL 查询范围之内的对象。

ExecuteQuery 方法也允许带有参数。请使用类似如下内容的代码来执行参数化查询。

    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'")
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
IEnumerable<Customer> results = db.ExecuteQuery<Customer>
    ("SELECT contactname FROM customers WHERE city = {0}",
    "London");

在查询文本中使用 Console.WriteLine() 和 String.Format() 所用的大括号表示法来表示参数。事实上,实际会对您提供的查询字符串调用 String.Format(),从而将括在大括号内的参数替换为生成的参数名,如 @p0、@p1@p(n)。

请参见

其他资源

背景信息 (LINQ to SQL)

查询数据库 (LINQ to SQL)