Проблема с PredicateBuilder - PullRequest
3 голосов
/ 24 мая 2011

У меня возникают проблемы с использованием PredicateBuilder для динамического добавления предложений «или где» в оператор LINQ.Сначала я объясню, чего я пытаюсь достичь.

У меня есть инвертированный индекс, в котором хранятся ключевые слова из названий группы ссылок.Я использую один, поэтому я могу быстро искать по этим ссылкам на основе этих ключевых слов.Инвертированный индекс имеет тип

Dictionary<string, List<VerifiedUrl>>

Таким образом, каждое слово в основном связано со списком URL-адресов, содержащих это слово.

На следующем этапе я делаю поиск по инвертированному индексу доступным для поиска.Поэтому, когда я ищу «синий», мне возвращаются все ссылки, связанные с ключом «the» или «blue».После нескольких поисков в Google лучший способ динамически добавлять предложения «или где» в оператор LINQ - это класс PredicateBuilder .У меня проблемы с последним шагом, когда я использую построенный предикат.

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 Ответ

8 голосов
/ 24 мая 2011

проблема в том, что аргумент .Where должен быть Func, но PredicateBuilder.Or возвращает выражение >. Попробуйте это

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