您要紧追EF.Functions.Like,如果还没有,则需要添加using Microsoft.EntityFrameworkCore;
。然后,您的查询将类似于:
query.Where(x => EF.Functions.Like(x.Name,$"%{payload.Name}%"))
这直接转换为生成的SQL语句中的LIKE
运算符。并非每个DBMS都可用,但是只要您添加了Microsoft.EntityFrameworkCore.SqlServer,您就可以准备就绪(假设您的问题已正确标记)。
,
我已经测试过类似的功能,但不能如op所述正确。因此,只剩下一个选择。这是创建一个拦截器并实现自定义逻辑。我创建了一个如下示例:
public class Suffixes
{
public const string Collate = "--Collate";
}
public class CollationDbCommandInterceptor : DbCommandInterceptor
{
private const string CollateSyntax = " collate turkish_ci_as";
public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command,CommandEventData eventData,InterceptionResult<DbDataReader> result)
{
var args = command.Parameters.OfType<DbParameter>()
.Where(t => t.DbType == DbType.String && t.Value.ToString().EndsWith(Suffixes.Collate)).ToList();
if (args.Count <= 0)
return base.ReaderExecuting(command,eventData,result);
foreach (var parameter in args)
{
parameter.Value = parameter.Value.ToString().Replace(Suffixes.Collate,"");
var equality = $"= {parameter.ParameterName}";
var ixs = AllIndexesOf(command.CommandText,equality);
#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
foreach (var eq in ixs)
{
command.CommandText = command.CommandText.Insert(eq+equality.Length,CollateSyntax);
}
#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
}
return base.ReaderExecuting(command,result);
}
private static IEnumerable<int> AllIndexesOf(string str,string value)
{
if (string.IsNullOrEmpty(value))
throw new ArgumentException("the string to find may not be empty",nameof(value));
var indexes = new List<int>();
for (var index = 0; ; index += value.Length)
{
index = str.IndexOf(value,index);
if (index == -1)
return indexes;
indexes.Insert(0,index);
}
}
}
配置:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
....
optionsBuilder.AddInterceptors(new CollationDbCommandInterceptor());
....
}
}
用法:
var kadayif = $"kadayıf{Suffixes.Collate}";
var william = $"Wİlliam{Suffixes.Collate}";
var auths = ctx.Authors.Where(t => t.FirstName == william ||t.LastName == kadayif).ToList();
// returns William Shakespeare and Abuzer Kadayıf
逻辑是创建一个拦截器,该拦截器在查询中传递的sql参数中查找特定的后缀。将查询特定的排序规则注入最终的sql命令文本中。我试图介绍一些高级方案,例如参数重用。可能需要更多改进。
请注意,此示例适用于Entity Framework Core 3.0,这是拦截器引入的版本。早期的ef核心版本中的拦截有些技巧。您可以参考this链接以获取更多信息。
本文链接:https://www.f2er.com/3011181.html