你如何将Linq扩展到SQL?

Geo*_*kos 11 linq linq-to-sql

去年,Scott Guthrie 表示 "如果你想要对执行的SQL进行绝对控制,你实际上可以覆盖LINQ to SQL使用的原始SQL",但我找不到描述可扩展性方法的文档.

我想修改以下LINQ to SQL查询:

using (NorthwindContext northwind = new NorthwindContext ()) {
    var q = from row in northwind.Customers
            let orderCount = row.Orders.Count ()
            select new {
                row.ContactName,
                orderCount
            };
}

这导致以下TSQL:

SELECT [t0].[ContactName], (
    SELECT COUNT(*)
    FROM [dbo].[Orders] AS [t1]
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ) AS [orderCount]
FROM [dbo].[Customers] AS [t0]

至:

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:

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

使用:

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;
}

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到SQL的可扩展性,比其他的这一个.有任何想法吗?

Dam*_*enG 9

更改底层提供程序并因此修改SQL的能力并未在LINQ to SQL中进行最终切割.

  • 我在LINQ to SQL开发团队:)如果你想修改一些特定的操作,你可以使用这里描述的技术http://damieng.com/blog/2009/04/12/linq-to-sql-tips- and-tricks-2但没有公开支持的可扩展性模型/提供者机制. (3认同)