我正在使用LINQ to SQL和LINQPad执行“相同”查询,但结果集略有不同。
代码是
var conn = new SqliteConnection (
"DbLinqProvider=Sqlite;" +
"Data Source=/home/larsenma/database.golden"
);
Models.Main db = new Models.Main (conn);
var runSum =
from rr in db.Runrecords
group rr by rr.RunID into rg
select new
{
LaneCount = rg.Count(),
}
LINQPad正确计算“LaneCount”,而使用LINQ to SQL我为每条记录获得1秒。
使用LINQ to SQL我使用sqlmetal生成我的DBLinq映射,而LINQPad使用IQ驱动程序。我的数据库是SQLite。
我对这个LINQ的东西比较新,有什么想法我错了吗?
EDITS
我将查询简化为极简主义可重现的实例。当我调试生成的SQL时,我得到了
SELECT (SELECT COUNT(*))
FROM runrecords
GROUP BY RunID
这是第二个“COUNT(*)”缺少的东西。
感谢。
答案 0 :(得分:5)
听起来你正在使用DBLinq,而不是LINQ to SQL。 sqlmetal工具生成实体类和类型化的DataContext - 但是如果你使用的是DBLinq,那么它实际上是将LINQ转换为SQL的DBLinq。
当我上次查看DBLinq(一两年前)时,它是相当原始的,甚至在一些基本查询中都没有。 LINQPad的IQ驱动程序使用Matt Warren's IQueryable toolkit,它可能是最复杂的提供程序无关的引擎,可用于将LINQ转换为SQL。另一个好的引擎是DevArt的LINQ Connect库 - 这在近期已经走过了漫长的道路并且还支持SQLite。
目前我正在更新IQ驱动程序以支持Oracle,并计划在IQueryable库本身上发布一些增强功能。你为什么不尝试使用这个或DevArt的库。