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