10

我目前在为我的项目使用 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 然后重写所有查询逻辑肯定会很麻烦。

4

5 回答 5

8

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

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

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

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

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

于 2012-11-14T08:37:54.003 回答
2

[观点]

没有大量的努力是不可能的。

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

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

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

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

于 2012-11-06T11:25:40.173 回答
2

您可能想看看Linker

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

对不起,如果它不是免费的!

于 2012-11-14T07:44:41.130 回答
1

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

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

于 2012-11-14T08:47:14.643 回答
1

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

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

于 2012-11-18T21:46:22.293 回答