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 的东西相当陌生,有什么想法我哪里出错了吗?
编辑
我已将查询简化为极简的可重现实例。当我调试生成的 SQL 时,我发现
SELECT (SELECT COUNT(*))
FROM runrecords
GROUP BY RunID
这是第二个“COUNT(*)”丢失的东西。
谢谢。
I am executing the "same" query using LINQ to SQL and in LINQPad, however the result set comes out slightly differently.
The code is
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 properly calculates the "LaneCount" while with LINQ to SQL I get 1s for each record.
With LINQ to SQL I used sqlmetal to generate my mapping for DBLinq and with LINQPad is used the IQ driver. My database is SQLite.
I'm rather new to this LINQ stuff, any ideas where I am going wrong?
EDITS
I've simplified my query to the minimalist reproducible instance. When I debug the generated SQL I get
SELECT (SELECT COUNT(*))
FROM runrecords
GROUP BY RunID
It is the second "COUNT(*)" that is missing things up.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
听起来您使用的是 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 的库呢?
It sounds like you're using DBLinq, not LINQ to SQL. The sqlmetal tool generates entity classes and a typed DataContext - however if you're using DBLinq, then it's DBLinq that's actually translating LINQ into SQL.
When I last looked at DBLinq (a year or two ago) it was fairly primitive and fell over on even some basic queries. LINQPad's IQ driver uses Matt Warren's IQueryable toolkit which is probably the most sophisticated provider-agnostic engine available for translating LINQ into SQL. Another good engine is DevArt's LINQ Connect library - this has come a long way in recent times and also supports SQLite.
Right now I'm in the process of updating the IQ driver to support Oracle, and also plan on posting some enhancements to the IQueryable library itself. Why don't you try using either this or DevArt's library.