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

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)