我有以下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)’方法,和这种方法不能被翻译成商店表达“。

什么是什么,我试图做选择?

有帮助吗?

解决方案

在响应于广告效果的考虑上的大数据集:

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

是否有一个原因,你必须在一个表中的字段多个关键字?你可以归说出来,有在那里的每个活动,您有一些关键字记录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;

其他提示

您的问题是,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到对象是不查询的第二部分中的发动机。

我的猜测是,你正在呼吁采取折中的办法。它应该采取一个数组。也许有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)。

您可能需要看约L2E和。载这个问题一个解决方案,应该比过滤客户端之前在一个超集猜测更有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top