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

时间:2014-05-29 09:16:40

标签: 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.

6 个答案:

答案 0 :(得分:10)

您无法使用实体框架执行此操作,如错误消息所示。

然而,有选择。

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

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

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

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

<强>更新

我重读了您的问题,并注意到您没有测试关键字相等性,只是Contains。如果是这样,为什么不做以下事情呢?

a.Keywords.Contains(x)

答案 1 :(得分:4)

实体框架不支持

String.Split。这只是因为SQL中没有等价物。

解决方案是:

  1. 在数据库中定义自定义函数 本文提出了几种解决方案:http://sqlperformance.com/2012/07/t-sql-queries/split-strings
  2. 使用[EdmFunction]属性向LINQ to Entities声明此函数,如下所述:How to call DB function from EF LINQ query?

答案 2 :(得分:2)

对于不涉及太多关键字和太多行的查询,您可以实现这种简单快速的解决方案。您可以通过反复优化结果轻松绕过Split功能,如下所示:

 public List<TblActivities> SearchByMultipleKeyword(string keywords)
 {
     string[] keywords = pKeywords.Split(',');

     var results = Entities.TblActivities.AsQueryable();    

     foreach(string k in keywords){

         results  = from a in results
                    where a.Keywords.Contains(k)
                    select a;
     }
     return results.ToList();
 }

答案 3 :(得分:2)

是的,你可以这样做:

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

答案 4 :(得分:0)

LINQ to Entities尝试将您的LINQ查询转换为SQL。由于它不知道如何在SQL查询中执行String.Split,因此失败。

这意味着除非您想编写String.Split的SQL实现,否则只能在LINQ to对象中执行,这意味着您需要先将所有数据加载到内存中,然后执行{{ 1}}子句。一种简单的方法是使用where

.ToList()

答案 5 :(得分:-4)

不确定,但您可以尝试:     由于错误似乎在寻找一个数组,这可能会有效。

string[] keyword = keywords.Split(new char[] {','});

var results  = (from a in Entities.TblActivities
                where a.Keywords.Split(new char[] {','}).Any(p => keyword.Contains(p))
                select a).ToList();