gpt4 book ai didi

c# - 编译查询中的 EF.Functions.Like 无法转换为等效的 SQL

转载 作者:行者123 更新时间:2023-12-04 07:38:48 33 4
gpt4 key购买 nike

我正在编写一个编译查询,它将 DBContext 和搜索字符串作为输入并返回 Class1 的列表
它基本上对 class1 对象运行 3 个过滤器,并返回一个过滤后的 class1 对象列表。
主要查询:

var temp = await context.Class1.Where(c => EF.Functions.Like(c.param1, $"%{query}%") && c.param2== 1 && c.param3!= 1).OrderBy(p => EF.Functions.Like(p.param1, $"{query}%") ? 0 : 1).AsNoTracking().ToListAsync();
这实际上会过滤列表,然后按顺序对它们进行排序,其中以搜索查询开头的名称显示在其他名称之前。
然后
var result = temp.Select(a => new Class2{ T1= a.A1, T2= a.A2, T3= a.A3}).Distinct().Take(10).ToList();
到目前为止,这是我编写的编译查询:
private static Func<DbContext, string, IEnumerable<Class1>> Search =
EF.CompileQuery((DbContext context, string query) =>
context.Class1
.Where(c => EF.Functions.Like(c.param1, $"%{query}%")
&& c.param2== 1
&& c.param3!= 1)
);
但是当这个编译的查询被调用时,它会抛出这个异常: linq 表达式无法翻译
如何解决这个问题?
更新:现在已经解决了。
private static Func<DbContext, string, IEnumerable<Class2>> Search =
EF.CompileQuery((DbContextcontext, string query) =>
context.Class1
.Where(c => c.param1.ToLower().Contains(query) && c.param2== 1 && c.param3!= 1)
.OrderBy(p => p.param1.ToLower().StartsWith(query) ? 0 : 1)
.Select(a => new Class2{ T1 = a.A1, T2 = a.A2, T3 = a.A3 })
.Take(10).AsNoTracking());

最佳答案

您似乎遇到了另一个 EF Core 限制。问题不在于EF.Functions.Like方法,但内部插入的字符串的用法,正如您发现的那样在常规查询中起作用,但在编译查询定义中不起作用。
解决方案/解决方法是使用字符串连接代替字符串插值:

private static Func<DbContext, string, IEnumerable<Class1>> Search =
EF.CompileQuery((DbContext context, string query) => context.Class1
.Where(c => EF.Functions.Like(c.param1, "%" + query + "%") // <--
&& c.param2== 1
&& c.param3!= 1)
);

生成的 SQL 查询有点不同,但至少你得到了一个翻译。

关于c# - 编译查询中的 EF.Functions.Like 无法转换为等效的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67599592/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com