【问题标题】:Linq to SQL: Simple group by generating many SQL queriesLinq to SQL:通过生成许多 SQL 查询的简单组
【发布时间】:2012-09-20 16:17:00
【问题描述】:

这是 C#/Linq:

Fbc_tickets.GroupBy(t => t.Fbt_household_id)

LinqPad 告诉我这正在被翻译成(MySQL):

SELECT t0.fbt_household_id
FROM fbc_ticket AS t0
GROUP BY t0.fbt_household_id

SELECT t0.fbc_ticket_id, t0.fbt_client_id, ...
FROM fbc_ticket AS t0
WHERE ((t0.fbt_household_id IS NULL AND @n0 IS NULL) OR (t0.fbt_household_id = @n0))
-- n0 = [1]

SELECT t0.fbc_ticket_id, t0.fbt_client_id, ...
FROM fbc_ticket AS t0
WHERE ((t0.fbt_household_id IS NULL AND @n0 IS NULL) OR (t0.fbt_household_id = @n0))
-- n0 = [2]

...

为什么会生成所有这些查询?我期待更类似于

SELECT * FROM fbc_ticket GROUP BY fbt_household_id

就是这样……

fbt_household_id 是无符号整数且不可为空。

【问题讨论】:

  • 你对 Linq 结果做了什么?循环遍历它?
  • 不要信任 LinqPad,运行查询并使用 SQL 分析器查看实际提交的内容。您获得的结果需要更多 Fbc_tickets.GroupBy(t => t.Fbt_household_id) 才能提交。您是否在其他地方使用该查询(或类似查询)?
  • @JoachimIsaksson:不。我没有用它做任何事情。这就是全部。我只想退出 SQL。
  • @Trisped: 嗯? SQL 探查器?我在其他地方有一些手写的 SQL,但我正在尝试编写一个相当复杂的查询,我希望 Linq 能帮助我。那,我只是想玩它并更好地学习它。
  • @Mark 我问的原因是 Linq 表达式通常不会被评估,除非你甚至对结果执行 ToList()、FirstOrDefault() 或类似操作。

标签: c# mysql linq linq-to-sql


【解决方案1】:

我一直在 linq-to-sql 中看到这一点。首先是获取分组键的查询,然后是每个键的查询以填充组。我不知道为什么要以这种方式实现它,但是恐怕您对此无能为力。 Entity Framework 在这个特定领域(不是在其他领域)要聪明得多。

当我连接到现有的 linq-to-sql 上下文时,Linqpad 也会这样做(并且不要让它动态创建上下文),所以我认为它与 Linqpad 没有任何关系。

【讨论】:

  • 是的,我想是 SQL 驱动程序“IQ”在做这件事。 EF 和 Linq-to-SQL 有什么区别?据我了解,LinqPad 正在创建具有底层属性(或者更确切地说是 CLR 程序集)的 C# 类,很像 EF 模型,然后除此之外,他们不会使用完全相同的驱动程序来翻译表达式树(Linq)到 SQL 中?
  • 是的,Linqpad 当然没有查询引擎。如果连接到数据库,它会构建一个带有 linq-to-sql 上下文的AppDomain。 EF 几乎从不(也许永远不会)在每个 linq 语句中发出超过一个查询。查询有时可能很可怕,但至少是一次。要在 Linqpad 中使用 EF,您可以连接到包含 EF 上下文的程序集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多