2010-12-14 71 views
1

比方说,我有以下查询:亚音速 - 转换的LINQ查询到SQL查询/ DataReader的

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

这就是我现在有。但是,我需要从结果中获得一个DataReader:

// that's what I need: 
var reader = ConvertSubSonicLinqQueryToDataReader(result); 

如何将linq语句转换为我可以使用的语句? 一个DataReader或一个DbCommand,甚至包含一个参数列表的纯sql。

我知道SubSonic可以做到这一点(因为它将查询翻译为普通的SQL),但我还没有发现任何公共可访问的方法。

有什么建议吗?

+0

你想用DataReader做什么?也许我们可以提出一些建议。 – 2010-12-14 13:24:36

+0

我必须将DataReader传递给第三方方法(将linq查询编译为普通的sql语句就足够了,因此我可以使用InlineQuery) – 2010-12-14 14:10:30

回答

1

转换LINQ查询是错误的方法。 LINQ以高于DataReader工作的抽象级别返回结果。

还存在延迟执行问题,因此您的LINQ查询可能无法作为单个SQL语句执行。

Rater比使用LINQ语句为什么不只是使用SqlQuery而不是?

var qry = new Select().From(Product.Schema).Where(Product.CategoryIdColumn).IsEqualTo(x); 

return qry.ExecuteReader(); 

编辑:
刚刚看到你使用SubSonic3(而不是2如上面的代码将是),但LINQ的潜在滥用和重复工作仍然有效。

+0

我知道Linq Query是首先获得的表达式如果需要的话执行(这就是为什么我在我的例子中包含两个语句“Count()”和“ToList()”,这导致两个不同的查询)。 SubSonic必须有能力将一个特定的IQuerable 转换为类似于“IDataReader”或“IDbCommand”的东西,因为在一天结束时亚音速必须针对dbms执行它。也许这种方法不在公共接口atm中,但我相信我会以某种方式解决它。顺便说一句。这很难解释,但我不能使用查询工具,因为我从另一个来源获得IQuerable。 – 2010-12-14 20:51:26

+0

@SchlaWiener要将一个'IQueryable '变成'IDataReader'需要挖掘一些'SubSonic.core'的源代码。我首先看看'SubSonic.Linq.Strucutre.QueryCompiler'和'SubSonic.SqlGenerator'。 – 2010-12-15 10:55:19

0

从DataReader创建对象的代码可以在DbDataProvider.ToEnumerable中找到。它从DbQueryProvider的Execute方法中调用(第227行)。 “理解”LINQ魔术的最好方法是在DbQueryProvider方法上放置一些断点。