我目前在为我的项目使用 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/