LINQ到实体:为什么我不能使用分割方法的条件?
-
20-09-2019 - |
题
我有以下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和。载这个问题一个解决方案,应该比过滤客户端之前在一个超集猜测更有效。