Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 亚音速-将linq查询转换为sql查询/数据读取器_C#_Linq_Subsonic_Subsonic3 - Fatal编程技术网

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