Chr*_*les 9 c# linq iqueryable linq-to-sql
我正在阅读一篇关于Linq to Sql的文章并且发现了这个:
IQueryProvider provider = new QueryProvider(database.GetCommand, database.ExecuteQuery);
IQueryable<Product> source = new Queryable<Product>(provider, database.GetTable<Product>());
IQueryable<string> results = source.Where(product => product.CategoryID == 2)
.OrderBy(product => product.ProductName)
.Select(product => product.ProductName)
.Skip(5)
.Take(10);
Run Code Online (Sandbox Code Playgroud)
然后作者将结果翻译成普通的sql:
exec sp_executesql N'SELECT [t1].[ProductName]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductName]) AS [ROW_NUMBER], [t0].[ProductName]
FROM [dbo].[Products] AS [t0]
WHERE [t0].[CategoryID] > @p0
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2
ORDER BY [t1].[ROW_NUMBER]',N'@p0 int,@p1 int,@p2 int',@p0=2,@p1=5,@p2=10
Run Code Online (Sandbox Code Playgroud)
而且我心里想,"神圣的牛!如果有一个IQueryable扩展可以在调试时为你生成这些字符串,那会不会很好?"
任何人都听说过这样的事情,如果有的话,你能指出我正确的方向吗?
谢谢!
使用 Linq to Sql,您可以调用query.Provider.ToString(),这将返回查询文本(顺便说一句,您可以在调试时在 Visual Studio 中观察相同的属性)。
更新:(复杂部分)它是如何实现的?
实际的字符串生成是由System.Data.Linq.SqlClient.SqlProvider类完成的。它有隐藏方法string IProvider.GetQueryText(Expression query),它根据传递的表达式构建 SQL 查询文本。该方法被内部接口隐藏IProvider,因此调用它并不是一件简单的事情。
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |