LINQ到实体:为什么我不能使用分割方法的条件?(LINQ to Entities: Why can

2019-07-04 02:19发布

我有以下LINQ查询:

var aKeyword = "ACT";
var results = from a in db.Activities
              where a.Keywords.Split(',').Contains(aKeyword) == true
              select a;

关键词是一个逗号分隔的领域。

每次我运行此查询,我得到以下错误:

“LINQ到实体无法识别方法‘布尔包含[字符串](System.Collections.Generic.IEnumerable`1 [System.String],System.String)’方法,和这种方法不能被翻译成表达店”。

究竟是为了什么,我试图做的方法吗?

Answer 1:

在回答关于大数据集的性能方面的考虑:

你要在客户端上做索引非通配符字符串匹配,所以是的,会有性能损失。

是否有一个原因,你必须在一个表中的字段多个关键字? 你可以归说出来,有在那里的每个活动,您有一些关键字记录ActivityKeywords表。

活动(ACTIVITY_ID,... / *删除关键字字段* /)---> ActivityKeywords(ACTIVITY_ID,keyword_id)--->关键词(keyword_id,值)

检查出的非第一范式: http://en.wikipedia.org/wiki/Database_normalization

编辑:另外即使你坚持使用一列,有一种方法做的一切服务器端(如果你有一个严格的语法:“关键词1,关键词,...,keywordN”):

var aKeyword = "ACT";
var results = (from a in db.Activities
              where a.Keywords.Contains("," + aKeyword) || a.Keywords.Contains(aKeyword + ",")
              select a;


Answer 2:

你的问题是,LINQ到的entites有翻译,你给它到SQL一切发送到数据库。

如果这真的是你需要做什么,你都必须强制LINQ到实体拉回来的所有数据和LINQ到对象评估条件。

例如:

var aKeyword = "ACT";
var results = from a in db.Activities.ToList()
              where a.Keywords.Split(',').Contains(aKeyword) == true
              select a;

要知道,虽然,这将拉回从活动表中的所有对象。 另一种可能是让DB做了一下最初的过滤器,并筛选下来之后剩下的路:

var aKeyword = "ACT";
var results = (from a in db.Activities
              where a.Keywords.Contains(aKeyword)
              select a).ToList().Where(a => a.KeyWords.Split(',').Contains(aKeyword));

这将让LINQ到实体做明白的过滤器(string.Contains成为一个像查询),将过滤了一些数据,然后通过LINQ到对象应用所需的真正的过滤器,一旦你有对象回。 该ToList()调用的力量LINQ到实体运行查询,并建立了对象,允许LINQ到对象是不查询的第二部分发动机。



Answer 3:

我的猜测是,你正在呼吁采取折中的办法。 它应该采取一个数组。 也许有Linq中的另一个分裂是寻找和给你一个不寻常的错误:

这适用于LINQ到对象:

 var dataStore = new List<string>
                    {
                        "foo,bar,zoo",
                        "yelp,foo",
                        "fred",
                        ""
                    };
 var results = from a in dataStore
               where a.Split(new[] {','}).Contains("foo")
               select a;

 foreach (var result in results)
 {
     Console.WriteLine("Match: {0}", result);
 }

输出以下内容:

Match: foo,bar,zoo
Match: yelp,foo

其实,思考它,你需要在所有的分裂? a.Contains("foo")可能是够你(除非你不想打foobar )。



Answer 4:

你可能想看看有关L2E和。载有这个问题了,应该是比过滤客户端前的一个超集猜测更有效的解决方案。



文章来源: LINQ to Entities: Why can't I use Split method as condition?