我有以下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和。载有这个问题了,应该是比过滤客户端前的一个超集猜测更有效的解决方案。