结合.Contains和.Like

问题描述

我有一个搜索模式列表(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 (将#修改为@)