问题描述
我有一个搜索模式列表(LIKE),想在表中查找与至少一个匹配的所有项。我的列表如下所示:
string[] searchList = {"mailto:Sam@%","mailto:info@%","phone:65331%"};
在SQL中,我会这样做:
var sqlCommand = "SELECT [Id],[Area] WHERE [TenantId] = @TenantId AND (";
for (var i = 0; i < searchList.Length; i++)
{
if (i > 0)
sqlCommand += " OR ";
sqlCommand += $"[Area] LIKE search{i}";
sqlCmd.Parameters.AddWithValue($"search{i}",searchList[i]);
}
sqlCommand += ")";
sqlCmd.CommandText = sqlCommand;
有什么办法可以使用Linq2Sql做到这一点?如果它将始终是数组中的三个项目,那将很简单:
var result = await context
.MyTable
.Where(mt => mt.TenantId == tenantId
&& (EF.Functions.Like(mt.Area,searchList[0])
|| EF.Functions.Like(mt.Area,searchList[1])
|| EF.Functions.Like(mt.Area,searchList[2])))
当然,它可能是searchList中的两项。或四个。或其他任何数字。
仅在进行LIKE比较时,我才需要这样的.Contains
:
var result = await context
.MyTable
.Where(mt => mt.TenantId == tenantId
&& searchList.Contains(mt.Area)) // does not work due to wildcards
在这些情况下,是否可以使用结合.Like
和.Contains
的任何方式?
还是在.Where
子句中使用某种循环?
更新
使用
var result = await context
.MyTable
.Where(mt => mt.TenantId == tenantId &&
searchList.Any(listItem => EF.Functions.Like(mt.Area,listItem)));
或
var result = await context
.MyTable
.Where(mt => mt.TenantId == tenantId &&
searchList.Any(listItem => mt.Area.StartsWith(listItem)));
是一个绝妙的主意,但是Linq2Sql-Interpreter ist不能将其转换为SQL查询:
System.InvalidOperationException: "The LINQ expression 'DbSet<MyTable> .Where(t => t.TenantId == tenantId && __searchList_1 .Any(sl => sl == "" || t.LastName != null && sl != null && t.LastName.StartsWith(sl)))' could not be translated.
更新2
我只是记得我可以构建我的SQL查询字符串并使用context.ExecuteQuery<>(sqlCommand)
来解决我的问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)