【问题标题】:subsonic - convert an linq query to sql query / DataReadersubsonic - 将 linq 查询转换为 sql 查询/DataReader
【发布时间】:2010-12-14 13:21:18
【问题描述】:

假设我有以下查询:

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),但我还没有在公共可访问方法中找到任何东西。

有什么建议吗?

【问题讨论】:

  • 你想用 DataReader 做什么?也许我们可以提出一些建议。
  • 我必须将 DataReader 传递给第三方方法(将 linq 查询编译为普通的 sql 语句就足够了,这样我就可以使用 InlineQuery)

标签: c# linq subsonic subsonic3


【解决方案1】:

转换 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 查询首先是一个表达式,并在需要时执行(这就是为什么我在示例中包含两个语句 Count()ToList(),这导致两个不同的查询)。 SubSonic 必须能够将特定的 IQuerable 转换为 IDataReaderIDbCommand 之类的东西,因为最终 subsonic 必须针对 dbms 执行它。也许该方法不在公共接口 atm 中,但我相信我会以某种方式弄清楚。顺便提一句。很难解释,但我不能使用查询工具,因为我从另一个来源获得 IQuerable。
  • @SchlaWiener 要将IQueryable&lt;T&gt; 转换为IDataReader,需要深入挖掘SubSonic.core 的来源。我先看看SubSonic.Linq.Strucutre.QueryCompilerSubSonic.SqlGenerator
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2017-02-23
    相关资源
    最近更新 更多