我正在为我们的应用程序开发搜索引擎。 用户应该能够找到包含更多单词或任何单词的项目。用户可以使用“查找包含所有单词的位置”或“查找包含任何单词的位置”。
我正在使用C#4.6.2和LINQ to SQL。
代码类似于:
var words = userInput.Split(' '); // can be something like "Hi all"
var result = selection.Where(q => words.Any(k => q.Name.Contains(k)));
在这种情况下,用户想要查找包含“Hi”或“all”
的项目当我尝试迭代结果时,我得到了这个异常: 除Contains运算符
外,本地序列不能用于查询运算符的LINQ to SQL实现你知道什么是最好的方法吗?
谢谢 的Jakub
答案 0 :(得分:0)
我查看了建议的解决方案,我更喜欢在服务器端搜索。所以我决定使用表达式树来创建健壮的查询。
ParameterExpression pe = Expression.Parameter(typeof(Address), "findingSource");
Expression left = Expression.Property(pe, "Name");
Expression right = Expression.Constant(words[0]);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
Expression expression = Expression.Call(left, method, right);
var result = expression;
for (var i = 1; i < words.Count; i++)
{
left = Expression.Property(pe, "Name");
right = Expression.Constant(words[i]);
method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
expression = Expression.Call(left, method, right);
result = Expression.OrElse(result, expression);
}
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { selection.ElementType },
selection.Expression,
Expression.Lambda<Func<Address, bool>>(result, new ParameterExpression[] { pe }));
return selection.Provider.CreateQuery<Address>(whereCallExpression);