如果我将实体框架表达式存储为字符串,如下所示:

var exp = "from user in users where user.Id == 1 select user.Name";

有没有办法使用EF Core将其转换为SQL?

我不需要运行SQL,只需获取将生成的SQL.

推荐答案

是的,可以运行存储在string变量中的Linq表达式.为此,您需要导入Microsoft.CodeAnalysis.CSharp.Scripting.

下面是您可以使用的代码片段

using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;

var users = new List<User>() { new User { Id = 1, Name = "John" }, new User { Id = 2, Name = "Jane" } };
var exp = "from user in users where user.Id == 1 select user.Name";

ScriptOptions options = ScriptOptions.Default.AddReferences(typeof(User).Assembly);
options = options.AddImports("System.Linq");

var filteredUsers = await CSharpScript.EvaluateAsync<IEnumerable<string>>(exp, options, new Globals{ users = users });

public class User
{
    public int Id { get; set; }
    public string? Name { get; set; }
}

public class Globals
{
    public List<User> users;
}

因此,如果您可以执行一个表达式,您也可以将其编译为SQL查询.希望字符串表达式中的ToQueryString() link1 link2可以帮助您获得SQL字符串

希望能有所帮助

Csharp相关问答推荐

Umbraco Lucene日期字段编码转换为.net日期时间

如何从C#中有类.x和类.y的类列表中映射List(字符串x,字符串y)?

==和Tuple对象的相等<>

为什么在ANTLR4中会出现不匹配的输入错误?""

可为空的泛型属性

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

如何将不同类型的扩展参数的javascript函数转换成C#风格?

如何忽略API JSON响应中的空字符串?

如何在C#中实现非抛出`MinBy`?

正确处理嵌套的本机集合

如何管理Azure认证客户端响应和证书 fingerprint

如何允许数组接受多个类型?

C#LINQ子字符串

ReadOnlyMemory访问基础索引的替代方案

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

使用Blazor WebAssembly提高初始页面加载时间的性能

C#中COM对象的实际地址

ASP.NET Core 8 Web API:如何添加版本控制?

SqlException:无法打开数据库.升级到Dotnet 8后-数据库兼容性版本-非EFCore兼容性级别

HttpClient,上传文件时实现进度