如何将Linq扩展到SQL?

如何将Linq扩展到SQL?

How do you extend Linq to SQL?

去年,斯科特·格思里(Scott Guthrie)说:"如果您想对执行的SQL进行绝对控制,那么您实际上可以覆盖LINQ to SQL使用的原始SQL",但是我找不到描述可扩展性方法的文档。

我想将以下LINQ修改为SQL查询:

1
2
3
4
5
6
7
8
using (NorthwindContext northwind = new NorthwindContext ()) {
    var q = from row in northwind.Customers
            let orderCount = row.Orders.Count ()
            select new {
                row.ContactName,
                orderCount
            };
}

这将导致以下TSQL:

1
2
3
4
5
6
SELECT [t0].[ContactName], (
    SELECT COUNT(*)
    FROM [dbo].[Orders] AS [t1]
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ) AS [orderCount]
FROM [dbo].[Customers] AS [t0]

至:

1
2
3
4
5
6
7
8
9
10
using (NorthwindContext northwind = new NorthwindContext ()) {
    var q = from row in northwind.Customers.With (
                        TableHint.NoLock, TableHint.Index (0))
            let orderCount = row.Orders.With (
                        TableHint.HoldLock).Count ()
            select new {
                row.ContactName,
                orderCount
            };
}

这将导致以下TSQL:

1
2
3
4
5
6
SELECT [t0].[ContactName], (
    SELECT COUNT(*)
    FROM [dbo].[Orders] AS [t1] WITH (HOLDLOCK)
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ) AS [orderCount]
FROM [dbo].[Customers] AS [t0] WITH (NOLOCK, INDEX(0))

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static Table<TEntity> With<TEntity> (
    this Table<TEntity> table,
    params TableHint[] args) where TEntity : class {

    //TODO: implement
    return table;
}
public static EntitySet<TEntity> With<TEntity> (
    this EntitySet<TEntity> entitySet,
    params TableHint[] args) where TEntity : class {

    //TODO: implement
    return entitySet;
}

1
2
3
4
5
6
7
8
9
10
11
public class TableHint {
    //TODO: implement
    public static TableHint NoLock;
    public static TableHint HoldLock;
    public static TableHint Index (int id) {
        return null;
    }
    public static TableHint Index (string name) {
        return null;
    }
}

除此以外,使用某种类型的LINQ to SQL可扩展性。 有任何想法吗?


更改基础提供程序并因此修改SQL的能力并未使LINQ to SQL最终切入。


马特·沃伦(Matt Warren)的博客提供了您所需的一切:

http://blogs.msdn.com/mattwar/


您想将表达式树转换为SQL ...您需要实现自己的IQueryProvider

IQueryProvider参考
如何

MSDN如何


DataContext x =新的DataContext;

//也许是这样?

var a = x.Where()。with()... etc

让我们对sql进行更好的控制。


推荐阅读

    linux安装执行命令?

    linux安装执行命令?,系统,软件,网络,密码,官方网站,在线,工作,盘中,电脑,第

    linux执行命令超时?

    linux执行命令超时?,时间,代码,系统,名字,环境,工作,服务,下来,名称,地址,如

    linux远程执行多命令?

    linux远程执行多命令?,工具,服务,命令,状态,暂停,代码,底部,时间,地址,系统,L

    linux命令行执行工具?

    linux命令行执行工具?,工具,系统,网络,分析,工作,服务,状态,信息,电脑,发行,s

    linux执行命令超时?

    linux执行命令超时?,时间,代码,系统,名字,环境,工作,服务,下来,名称,地址,如

    linux控制台创建命令?

    linux控制台创建命令?,工作,地址,系统,命令,信息,目录,管理,名字,文件,控制

    linux安装执行命令?

    linux安装执行命令?,系统,软件,网络,密码,官方网站,在线,工作,盘中,电脑,第

    linux执行两条命令?

    linux执行两条命令?,单位,工作,地址,命令,连续,系统,分行,权威,信息,目录,Lin

    linux执行pl命令?

    linux执行pl命令?,代码,服务,工具,位置,标准,系统,首页,数据,操纵,环境,perl

    linux命令执行10次?

    linux命令执行10次?,地址,工作,信息,系统,命令,目录,标准,设备,发行,文件,Lin

    linux执行命令后无号?

    linux执行命令后无号?,系统,环境,信息,工具,状态,数据,命令,文件,字符集,环

    linux控制台多命令行?

    linux控制台多命令行?,工具,服务,情况,地址,连续,命令,窗口,终端,脚本,控制

    linux周期执行命令?

    linux周期执行命令?,工作,系统,周期,地址,命令,工具,信息,时间,任务,目录,lin

    linux常用命令文档?

    linux常用命令文档?,工作,系统,地址,管理,网络,命令,信息,目录,操作,文件,lin

    linux执行命令被阻止?

    linux执行命令被阻止?,档案,系统,服务,网络,工具,在线,信息,基础,状态,命令,

    linux执行命令大全?

    linux执行命令大全?,工作,系统,地址,信息,命令,目录,工具,基础,设备,发行,Lin

    循环执行linux命令?

    循环执行linux命令?,工具,系统,名称,代码,第一,环境,位置,数字,脚本,变量,Lin

    linux命令执行很慢?

    linux命令执行很慢?,软件,系统,工具,分析,机构,服务,培训,教育,数字,数据,Lin

    linux命令行执行py?

    linux命令行执行py?,系统,环境,官网,一致,文件,程序,脚本,源文件,后台,终端,l

    linux查看执行命令?

    linux查看执行命令?,系统,服务,情况,信息,命令,暂停,标准,概念,实时,第一,lin