PredicateBuilder问题

时间:2011-05-24 04:37:29

标签: c# linq where predicatebuilder

我在使用PredicateBuilder动态地将“Or Where”子句添加到LINQ语句时遇到了问题。我将首先解释一下我想要完成的事情。

我有一个倒排索引,用于存储来自一堆链接标题的关键字。我正在使用一个,所以我可以根据这些关键字快速搜索这些链接。倒排索引的类型为

Dictionary<string, List<VerifiedUrl>>

所以基本上每个单词都与包含该单词的URL列表相关联。

我正在进行的下一个阶段是使倒排索引可搜索。因此,当我搜索“蓝色”时,我返回了与“the”或“blue”键相关联的所有链接。在几次Google搜索之后,似乎是通过PredicateBuilder类向LINQ语句动态添加“或Where”子句的最佳方式。我在使用我构建的谓词的最后一步遇到了麻烦。

var invertedIndex = new Dictionary<string, List<VerifiedUrl>>();

//the invertedIndex is built and filled here. Now I am trying to search through it.

Console.WriteLine("\nEnter words to see if there are matches");
string query = Console.ReadLine();
Console.WriteLine();

string[] words = query.Split(',', ' '); 

//the predicate I'll be building. I'm not positive it is of the correct type. I've assumed that it should be of the same type as the Dictionary type in the inverted index
var predicate = PredicateBuilder.False<KeyValuePair<string, List<VerifiedUrl>>>();

foreach (string w in words)
{
    string temp = w;
    predicate = predicate.Or(p => p.Key == temp);
}
//this is the line that generates the syntax error.
test = invertedIndex.Where(predicate);

我在.Where语句中遇到错误。将鼠标悬停在.Where上会显示“无法根据用法推断出类型参数。请尝试完全指定类型参数。”

我尝试过改变:

var predicate = PredicateBuilder.False<KeyValuePair<string, List<VerifiedUrl>>>();

Expression<Func<KeyValuePair<string, List<VerifiedUrl>>, bool>> predicate = PredicateBuilder.False<KeyValuePair<string, List<VerifiedUrl>>>();

但这没有效果。在错误控制台中,我实际上得到了不同的错误:

Error   1   Instance argument: cannot convert from 'System.Collections.Generic.Dictionary<string,System.Collections.Generic.List<InvertedIndexConsoleApp.VerifiedUrl>>' to 'System.Linq.IQueryable<System.Collections.Generic.KeyValuePair<string,System.Collections.Generic.List<InvertedIndexConsoleApp.VerifiedUrl>>>'   c:\users\josh\documents\visual studio 2010\Projects\InvertedIndexConsoleApp\InvertedIndexConsoleApp\Program.cs  79  25  InvertedIndexConsoleApp

Error   2   'System.Collections.Generic.Dictionary<string,System.Collections.Generic.List<InvertedIndexConsoleApp.VerifiedUrl>>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)' has some invalid arguments c:\users\josh\documents\visual studio 2010\Projects\InvertedIndexConsoleApp\InvertedIndexConsoleApp\Program.cs  79  25  InvertedIndexConsoleApp

1 个答案:

答案 0 :(得分:8)

问题是.Where参数必须是Func,但PredicateBuilder.Or返回Expression&lt; FUNC&LT; ..&GT;取代。 试试这个

test = invertedIndex.Where(predicate.Compile());