13

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

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

使用 (NorthwindContext 北风 = 新 NorthwindContext ()) {
    var q = from row in northwind.Customers
            让 orderCount = row.Orders.Count()
            选择新的{
                row.ContactName,
                订单数
            };
}

这导致以下 TSQL:

选择 [t0].[联系人姓名], (
    选择计数(*)
    FROM [dbo].[订单] AS [t1]
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ) AS [orderCount]
FROM [dbo].[客户] AS [t0]

到:

使用 (NorthwindContext 北风 = 新 NorthwindContext ()) {
    var q = from row in northwind.Customers.With (
                        TableHint.NoLock, TableHint.Index (0))
            让 orderCount = row.Orders.With (
                        TableHint.HoldLock).Count()
            选择新的{
                row.ContactName,
                订单数
            };
}

导致以下 TSQL:

选择 [t0].[联系人姓名], (
    选择计数(*)
    FROM [dbo].[Orders] AS [t1] WITH (HOLDLOCK)
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ) AS [orderCount]
FROM [dbo].[Customers] AS [t0] WITH (NOLOCK, INDEX(0))

使用:

公共静态表<TEntity> With<TEntity> (
    这个 Table<TEntity> 表,
    参数 TableHint[] args) 其中 TEntity : 类 {

    //TODO:实现
    返回表;
}
公共静态 EntitySet<TEntity> With<TEntity> (
    这个 EntitySet<TEntity> 实体集,
    参数 TableHint[] args) 其中 TEntity : 类 {

    //TODO:实现
    返回实体集;
}

公共类 TableHint {
    //TODO:实现
    公共静态 TableHint 无锁;
    公共静态 TableHint HoldLock;
    公共静态 TableHint 索引(int id){
        返回空值;
    }
    公共静态 TableHint 索引(字符串名称){
        返回空值;
    }
}

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

4

2 回答 2

10

更改底层提供程序并因此修改 SQL 的能力并未最终影响 LINQ to SQL。

于 2008-09-15T23:42:05.320 回答
-1

DataContext x = new DataContext

大概是这样的?

var a = x.Where().with()...ETC

它使您可以更好地控制 SQL。

于 2008-09-15T16:48:59.450 回答