C# 亚音速-将linq查询转换为sql查询/数据读取器
假设我对以下查询有一个查询:C# 亚音速-将linq查询转换为sql查询/数据读取器,c#,linq,subsonic,subsonic3,C#,Linq,Subsonic,Subsonic3,假设我对以下查询有一个查询: int x = 5; var result = from p in db.products where p.CategoryId == x select p; int count = result.Count(); List<product> products = result.ToList(); 如何将linq语句转换为可以使用的语句? DataReader或DbCommand,甚至是带有参数列表
int x = 5;
var result = from p in db.products
where p.CategoryId == x
select p;
int count = result.Count();
List<product> products = result.ToList();
如何将linq语句转换为可以使用的语句?
DataReader或DbCommand,甚至是带有参数列表的普通sql
我知道亚音速可以做到这一点(因为它将查询转换为普通sql),但我还没有在公共可访问方法中找到任何东西
有什么建议吗?转换LINQ查询是错误的方法。LINQ以比DataReader更高的抽象级别返回结果 还有延迟执行的问题,因此您的LINQ查询可能不会作为单个SQL语句执行 比使用LINQ语句更有效为什么不直接使用
SqlQuery
var qry = new Select().From(Product.Schema).Where(Product.CategoryIdColumn).IsEqualTo(x);
return qry.ExecuteReader();
编辑:刚才看到您正在使用SubSonic3(而不是上面代码中的2),但是LINQ的潜在误用和工作重复仍然存在。转换LINQ查询是错误的方法。LINQ以比DataReader更高的抽象级别返回结果 还有延迟执行的问题,因此您的LINQ查询可能不会作为单个SQL语句执行 比使用LINQ语句更有效为什么不直接使用
SqlQuery
var qry = new Select().From(Product.Schema).Where(Product.CategoryIdColumn).IsEqualTo(x);
return qry.ExecuteReader();
编辑:刚刚看到您正在使用SubSonic3(而不是上面代码中的2),但LINQ的潜在误用和工作重复仍然存在。从DataReader创建对象的代码可以在DbDataProvider.ToEnumerable中找到。它是从DbQueryProvider的执行方法(第227行)调用的。“理解”LINQ魔力的最佳方法是在DbQueryProvider方法上放置一些断点 可以在DbDataProvider.ToEnumerable中找到从DataReader创建对象的代码。它是从DbQueryProvider的执行方法(第227行)调用的。“理解”LINQ魔力的最佳方法是在DbQueryProvider方法上放置一些断点 您想用DataReader做什么?也许我们可以提出一些建议。我必须将DataReader传递给第三方方法(将linq查询编译为普通sql语句就足够了,这样我就可以使用InlineQuery了)您想对DataReader做什么?也许我们可以提出一些建议。我必须将DataReader传递给第三方方法(将linq查询编译为普通sql语句就足够了,这样我就可以使用InlineQuery了)我知道linq查询首先是一个表达式,如果需要的话可以执行get(这就是为什么我包括两条语句,
Count()
和ToList()
,这将导致两个不同的查询)。亚音速必须能够将特定的iQuable转换为类似于IDataReader
或IDbCommand
的东西,因为在一天结束时,亚音速必须针对dbms执行它。也许这种方法不在公共接口atm中,但我相信我会找到办法的。顺便说一句,这很难解释,但我不能使用querytool,因为我从另一个来源获得IQuerable。@Schlaviener将IQuerable
转换为IDataReader
需要对亚音速.core
的源代码进行一些挖掘。我先看一下SubSonic.Linq.structure.QueryCompiler
和SubSonic.SqlGenerator
。我知道Linq查询首先是一个表达式,如果需要,get会被执行(这就是为什么我在示例中包含了两条语句,Count()
和ToList()
,这会导致两个不同的查询)。亚音速必须能够将特定的iQuable转换为类似于IDataReader
或IDbCommand
的东西,因为在一天结束时,亚音速必须针对dbms执行它。也许这种方法不在公共接口atm中,但我相信我会找到办法的。顺便说一句,这很难解释,但我不能使用querytool,因为我从另一个来源获得IQuerable。@Schlaviener将IQuerable
转换为IDataReader
需要对亚音速.core
的源代码进行一些挖掘。我首先看一下亚音速.Linq.structure.QueryCompiler
和亚音速.SqlGenerator
。