LINQ - LINQ to SQL与LINQPad的结果不同

时间:2011-05-03 17:04:35

标签: linq linq-to-sql linqpad

我正在使用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(*)”缺少的东西。

感谢。

1 个答案:

答案 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的库。