我使用 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 东西还很陌生,有什么想法我哪里出错了吗?
编辑
我已将查询简化为极简的可重现实例。当我调试生成的 SQL 时,我得到
SELECT (SELECT COUNT(*))
FROM runrecords
GROUP BY RunID
这是第二个“COUNT(*)”丢失的东西。
谢谢。
最佳答案
听起来您正在使用 DBLinq,而不是 LINQ to SQL。 sqlmetal 工具生成实体类和类型化的 DataContext - 但是,如果您使用 DBLinq,那么实际上是 DBLinq 将 LINQ 转换为 SQL。
当我上次查看 DBLinq 时(一两年前),它相当原始,甚至在一些基本查询上都失败了。 LINQPad的IQ驱动使用Matt Warren's IQueryable toolkit这可能是可用于将 LINQ 转换为 SQL 的最复杂的与提供者无关的引擎。另一个优秀的引擎是 DevArt 的 LINQ Connect 库 - 最近它已经取得了长足的进步,并且还支持 SQLite。
现在我正在更新 IQ 驱动程序以支持 Oracle,并且还计划发布对 IQueryable 库本身的一些增强功能。为什么不尝试使用这个库或 DevArt 的库。
关于LINQ - LINQ to SQL 与 LINQPad 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873048/