c# - 将文本 SQL 与 LINQ 结合使用

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

我目前在为我的项目使用 LINQ to SQL 时遇到问题。这是因为大多数冗长的 SQL 查询(或 View )都被硬编码到 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);

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

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

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

最佳答案

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

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

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

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

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

关于c# - 将文本 SQL 与 LINQ 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13249220/

相关文章:

c# - 远程服务器返回意外响应 : (413) Request Entity Too Large.

php - 通知: Unidentified Index: QNo in C:\\xampp\htdocs\,

SQL 连接 : Select status of reviews submitted by employees and also the list of employees who have not submitted the review for each year

sql-server - 安装后如何添加sql server Analysis Services 2008 R2的管理员用户?

c# - 如何按顺序运行 selenium C# 测试用例?

c# - 什么可能是我的 C# WCF 服务上的速率限制 CPU 周期?

c# - 生成的 WEB API 帮助区域文档不显示响应正文格式/示例

sql - 创建表,复制没有数据的字段,然后复制下一个字段中的数据

c# - 多用户连接并同时进行 CRUD

sql-server - SQL查询来搜索具有特定文本的记录?