假设我有以下问题:
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 :(得分: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方法上放置一些断点。