【问题标题】:Linq.dynamic.core IQueryable to SQL statementLinq.dynamic.core IQueryable to SQL 语句
【发布时间】:2020-05-03 10:01:19
【问题描述】:

我目前正在使用System.Linq.Dynamic.Core 在我的应用程序中生成 SQL 语句。问题是当我尝试

db.table.select("new (column1 as a1)").ToString()

生成的 SQL 字符串会自动添加另一个 1 AS [C1] 并且列别名 a1 没有出现在输出字符串中:

SELECT 
    1 AS [C1],
    [Extent1].[column1] AS [column1]
FROM 
    (SELECT 
         [table].[column1] AS [column1]
     FROM 
         table AS [table]) AS [Extent1]

我的问题是如何实现以下结果以及为什么会发生上述行为。

SELECT 
    [Extent1].[column1] AS [c1]
FROM 
    (SELECT 
         [table].[column1] AS [column1]
     FROM 
         table AS [table]) AS [Extent1]

【问题讨论】:

  • 经过长时间的搜索,我意识到使用LINQ 实现上述结果是一项痛苦的工作,看起来LINQ 的最终目的是处理List object 将被返回。所以我决定使用 sql builder 库https://sqlkata.com/ 来生成所需的查询。

标签: c# sql linq


【解决方案1】:

尝试将获取数据的代码行更改为

var list = db.table.Select("new (column1 as a1)").ToDynamicList();

结果将是每个具有a1 属性的动态对象的List<dynamic>

实际的 SQL 语句可能不同,但返回的属性名称将遵循别名。

【讨论】:

  • 嗨 Martin,我的意图是检索 LINQ 在后台生成的 SQL 语句并将此字符串传递给 cmd.ExecuteReader() 以进行逐行处理。我知道ToDynamicList() 将返回具有正确列名的 List 对象。所以问题仍然存在"Will it possible to tell LINQ to generate the SQL statement with the correct column alias ?"
  • 恕我直言,依靠自己的sql语句会更容易和安全,实体框架生成的语句可能会因版本而异。在我使用 EF Core 进行的测试中,这些语句看起来与您在问题中发布的不同。
  • 感谢 Martin,根据您的建议,我决定采用 sqlTaka 库来生成我自己的查询并控制 SQL 语句的性能(看起来像 LINQ 生成的查询有一些性能如果由于大量包装查询而使查询变得复杂,则麻烦)。但很高兴知道为什么LINQ 生成了奇怪的列1 AS [C1]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多