Как реализовать поиск по ключевым словам в NHibernate 3 с помощью LINQ? - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть объект, который выглядит следующим образом:

public class Media
{
    public virtual string Caption { get; set; }
    public virtual string Description { get; set; }
    public virtual string Notes { get; set; }
}

Я хотел бы предоставить пользователю возможность поиска по нескольким ключевым словам в Caption, DescriptionNotes свойства.Другими словами, если пользователь ищет « яблочный банан », он должен выполнить поиск по трем строковым свойствам, чтобы узнать, содержит ли какое-либо из них « яблоко » и « банан». '.

Я попробовал следующее утверждение LINQ в качестве теста:

var query = new[] { "apple", "banana" };

// GetAll<T> returns an IQueryable<T>
repo.GetAll<Media>().Where(x => query.All(x.Caption.Contains));

Но я получаю исключение:

ArgumentException:'Объект типа System.Linq.Expressions.UnaryExpression 'не может быть преобразован в тип' System.Linq.Expressions.LambdaExpression '.

Я знаю, что поставщик LINQ для NHib 3.0 не реализует все LINQфункции.Как мне переписать этот запрос LINQ, чтобы он был совместим с NHibernate LINQ?

1 Ответ

3 голосов
/ 31 декабря 2010

Имейте в виду, что даже если вы поймете, как оптимально делать то, что вы хотите, с Linq, он все равно по сути будет переведен в оператор SQL, который по определению будет выглядеть следующим образом:

(Подпись LIKE "% apple%" И Подпись LIKE "% banana"%) ИЛИ (Описание "LIKE"% apple% "И Описание" LANE "% banana%") .. и т. Д.

Или, конечно,неоптимальный метод может привести к возврату каждой записи и последующей оценке условий локально.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...