subsonic - 将linq查询转换为sql query / DataReader

时间:2010-12-14 13:21:19

标签: 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();

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

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

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

我知道SubSonic可以做到这一点(因为它无论如何都会将查询翻译成普通的sql)但我还没有在公共可访问方法中找到任何东西。

有什么建议吗?

2 个答案:

答案 0 :(得分: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的潜在误用和重复工作仍然存在。

答案 1 :(得分:0)

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