我使用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,我得到每条记录15。
使用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的IQueryable工具包,该工具包可能是用于将LINQ转换为SQL的最复杂的与提供者无关的引擎。另一个不错的引擎是DevArt的LINQ Connect库,它在最近的一段时间里取得了长足的进步,并且还支持SQLite。
现在我正在更新IQ驱动程序以支持Oracle,并且还计划发布一些对IQueryable库本身的增强。你为什么不试试这个或者DevArt的库呢?