c# - LINQ to Entities 无法识别方法 'System.String[] Split(Char[])' 方法,

标签 c# string linq

我正在尝试实现一种方法,其中存储在数据库中的事件关键字(以逗号分隔)与给定字符串以逗号分隔相匹配。

public List<TblActivities> SearchByMultipleKeyword(string keywords)
{
    string[] keyword = keywords.Split(',');
    var results  = (from a in Entities.TblActivities
                    where a.Keywords.Split(',').Any(p => keyword.Contains(p))
                    select a).ToList();
    return results;
}

我收到以下错误:

LINQ to Entities does not recognize the method 'System.String[] Split(Char[])' method,
and this method cannot be translated into a store expression.

最佳答案

如错误消息所述,您不能使用 Entity Framework 执行此操作。

但是,还有其他选择。

一个选择是意识到,如果关键字存储为 A,B,C,D,那么 x 就在那里,如果

a.Keywords.StartsWith(x + ",") || 
a.Keywords.Contains("," + x + ",") || 
a.Keywords.EndsWith("," + x)

如果 x 不包含 , 本身,这将起作用。缺点是这将对表或包含 Keywords 列的索引进行全面扫描。

另一种选择是规范化您的数据库。毕竟,事件和关键字之间存在一对多关系。然后这样建模:除了 Activities 表(没有 Keywords 列)之外,还有一个包含两列的 KeyWords 表,一个事件表的外键,以及keyword 列。这将允许您在 keyword 列上添加索引,这可以使查询超快。

更新

我重新阅读了您的问题,发现您没有测试关键字相等性,而只是测试包含。如果是这样,您为什么不执行以下操作?

a.Keywords.Contains(x)

关于c# - LINQ to Entities 无法识别方法 'System.String[] Split(Char[])' 方法,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23929801/

相关文章:

java - 为什么这些 Java replaceAll 语句不起作用?

c++ - 使用运算符 [ ] 将字符串放入映射中

c# - 这是使用 LINQ to SQL 时的虚假警告吗?

c# - 设置 Mock 以返回我发送给它的同一个对象?

c# - 有没有办法在 lambda 表达式树中使用 `dynamic`?

c - 如何在 html 中搜索字符串模式,用 C 编码?

c# - 使用 Linq 表达式作为具有父/子查询的规范模式

c# - 无法将类型 'System.Linq.IQueryable<int>' 隐式转换为 'int?'

c# - 如何创建一个接受 Controller 参数而不更改子 Controller 的基类?

c# - 在 Mac 上分析 .net core 应用程序?