2008-09-15 42 views
10

Năm ngoái, Scott Guthrie stated “Bạn thực sự có thể ghi đè lên SQL thô mà LINQ to SQL sử dụng nếu bạn muốn kiểm soát tuyệt đối đối với SQL được thực hiện”, nhưng tôi không thể tìm thấy tài liệu mô tả phương pháp mở rộng.Làm cách nào để bạn mở rộng LINQ to SQL?

Tôi muốn thay đổi LINQ sau đây để truy vấn SQL:

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

Những kết quả trong các TSQL sau:

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

nào sẽ dẫn đến TSQL sau:

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

Sử dụng:

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

Sử dụng một số loại hình LINQ to SQL mở rộng, trừ this one. Bất kỳ ý tưởng?

Trả lời

7

Khả năng thay đổi nhà cung cấp tiềm ẩn và do đó thay đổi SQL đã không thực hiện việc cắt giảm cuối cùng trong LINQ to SQL.

blog của
+0

+1 Bất kỳ cơ hội nào bạn có nguồn cho điều này? –

+2

Tôi đã ở trong nhóm LINQ to SQL dev :) Nếu bạn muốn sửa đổi một số hoạt động cụ thể, bạn có thể sử dụng kỹ thuật được mô tả tại đây http://damieng.com/blog/2009/04/12/linq-to-sql-tips -and-tricks-2 nhưng không có cơ chế mô hình/nhà cung cấp có thể mở rộng được hỗ trợ công khai. – DamienG

0

DataContext x = new DataContext;

// Điều gì đó giống như vậy?

var a = x.Where(). With() ... etc

để bạn có quyền kiểm soát tốt hơn so với sql.

+0

Thậm chí nếu điều này không làm việc, không 'var a = x.Where() ... 'có nghĩa là bạn đã thực hiện một 'select' và do đó có các bản ghi mà bạn không nên truy vấn ở nơi đầu tiên? – IAbstract

0

Bạn muốn dịch một cây biểu vào SQL ... Bạn cần phải thực hiện IQueryProvider của riêng bạn

IQueryProvider Reference
How To

MSDN How To

+1

Dường như cộng đồng cần phải bước lên với việc triển khai mở nhà cung cấp truy vấn cho cây biểu thức sql :-) –

+0

Thực ra, tôi muốn _extend_ Linq triển khai IQueryProvider của SQL ... –

Các vấn đề liên quan