【问题标题】:LINQ - Different results with LINQ to SQL vs LINQPadLINQ - LINQ to SQL 与 LINQPad 的不同结果
【发布时间】:2011-05-03 17:04:35
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: linq linq-to-sql linqpad


    【解决方案1】:

    听起来您使用的是 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 的库。

    【讨论】:

    • 谢谢乔。你是对的。我没有意识到mono中包含的LINQ to SQL的实现是DBLinq。应该在我的问题中提到这一点。
    • IQueryable 工具包是开源的,因此您可以在 Mono 中成功编译它。让我知道你过得怎么样。
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多