【问题标题】:Using text SQL with LINQ将文本 SQL 与 LINQ 结合使用
【发布时间】:2012-11-06 10:38:12
【问题描述】:

我目前在为我的项目使用 LINQ to SQL 时遇到问题。这是因为大部分冗长的 SQL 查询(或者说是 视图)都被硬编码到 C# 中,而我们一直在做的就是使用 context.Database.SqlQuery<ClassName>(sql, sqlParams)

它通常非常有效,但现在我们需要一些更有活力的东西。我们需要插入像.Where(x => x.Name.Contains("Anonymous")).Take(20) 这样的东西或其他类似的东西。但是,直接插入前面提到的代码行会导致以下结果:

context.Database.SqlQuery<ClassName>(sql, sqlParams).Where(x => x.Name.Contains("Anonymous")).Take(20);

虽然它确实有效并提取了名称包含“匿名”的前 20 条记录,但性能非常糟糕。它在后台所做的是从该表中获取所有记录,然后在将它们加载到内存后最终过滤它们。

然后我想问一下,有没有办法将文本 SQL 转换为 LINQ,或者将 LINQ 转换为 SQL,这样我就可以在一个语句中执行我的文本 SQL 和 LINQ。如果您实际上没有解决方案,我也很乐意感谢您的建议...!

编辑:我考虑过使用表达式树,但我不确定它们如何真正适合图片。另外,我考虑过使用数据库视图。但是有这么多视图(每个表相当多),将所有内容移植到 MS SQL 然后重写所有查询逻辑肯定会很麻烦。

【问题讨论】:

  • 为什么在 LINQ 中使用SqlQuery 而不是在 DataContext 中使用 Table
  • 由于两者架构的巨大差异,您可能提出的任何 SQL 到 LINQ 或 LINQ 到 SQL 的转换都是不可靠的。我建议在 LINQ 中完全重写查询并避免使用普通 SQL。
  • 所以你想将一种过时的技术与其他过时的技术合并。也许是时候做些不同的事情了。
  • 你有什么建议,那还不算过时? :(
  • 仅供参考,实体框架是一项不会过时的技术。

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


【解决方案1】:

您不能真正做到这一点,因为表达式树从动态构建的表达式生成 SQL,即从您可以“编译”SQL 的表达式中生成 SQL,您所要求的类似于要求“SQL-to-LINQ”反汇编程序”。

我对您的问题的建议是 - 将您的 SQL 查询保存为数据库中的视图,然后将您的视图映射到 LINQ-To-SQL .dbml 文件中,并在此之上添加您的 LINQ 查询。

context.viewSavedFromYourSql.Where(x => x.Name.Contains("Anonymous")).Take(20);

这样 LINQ 将从您的视图中查询,并仅返回您需要的数据。

(您也可以使用表值函数代替视图)

【讨论】:

    【解决方案2】:

    [意见]

    如果不付出大量努力,这不太可能。

    您似乎要求的是 sql -> sql 模型标记器或完整的 sql -> IQueryable 标记器,这两者都将是实施的重大努力。

    我的建议是要么编写一个粗略的 sql 解析器,然后放入所需的语句,要么将您的视图重写为 LinqToDatabase 查询。

    作为解释,当您创建 IQueryable 表达式时,其表达式树是查询的对象逻辑,然后您的提供程序采用该逻辑并尝试将其映射到一系列要执行的 sql 语句和结果的映射器。您似乎要求相反,因此您希望将一系列 sql 语句转换回表达式树。

    这对我来说似乎有点双重工作,因为您将映射到一个表达式树,附加到它上面,然后再映射回来。尤其是因为一个完美的地图可能是不可能的,所以你会发现你会得到等价的但不是你期望的 sql。

    【讨论】:

      【解决方案3】:

      您可能想看看Linker

      它将 SQL 语句转换为 LINQ 语句。显然它不能转换所有类型的 SQL 查询,但是如果您想将所有硬编码的 SQL 查询转换为 LINQ 语句,它对您有很大帮助。

      如果不是免费的,请见谅!

      【讨论】:

        【解决方案4】:

        您不能将您的查询存储到存储过程中并使用您的搜索文本作为参数调用它们吗?可以通过您的 LINQ-To-SQL 调用过程。这应该可以节省你一些时间..

        有关调用简单/复杂过程的更多信息的链接:http://www.codeproject.com/Articles/230380/LINQ-to-SQL-Advanced-Concepts-and-Features

        【讨论】:

          【解决方案5】:

          要查看在Visual Studio 中生成的SQL,设置断点并将鼠标光标移动到变量上(linq 查询不应以.ToList() 或ToArray() 结尾)或使用此方法How to view LINQ Generated SQL statements?。要将 sql 转换为 linq,请看这里:http://www.sqltolinq.com/

          您可以创建快速且高质量的存储过程,并将其添加到数据上下文中,以便在 linq 查询中使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-17
            • 2017-04-26
            • 2017-07-26
            • 1970-01-01
            • 2012-04-08
            • 1970-01-01
            • 2013-06-01
            • 2019-03-03
            相关资源
            最近更新 更多