Я пытаюсь преобразовать следующий SQL в NHibernate:Нечеткий поиск на каскадных Полное имя с помощью NHibernate
SELECT * FROM dbo.Customer
WHERE FirstName + ' ' + LastName LIKE '%' + 'bob smith' + '%'
Я пытался сделать что-то вроде этого, но он не работает:
name = "%" + name + "%";
var customers = _session.QueryOver<Customer>()
.Where(NHibernate.Criterion.Restrictions.On<Customer>(c => c.FirstName + ' ' + c.LastName).IsLike(name))
.List();
То, что я в основном пытаюсь сделать, - это поиск имени клиента в текстовом поле со значением примера «bob smith» и для его поиска в базе данных с использованием выражения LIKE в SQL выше.
Если я собираюсь неправильно искать столбцы FirstName и LastName, пожалуйста, помогите мне с альтернативой, но приведенный выше SQL-запрос доставит мне то, что мне нужно.
Update 2 решения:
Так что я в настоящее время нашел два решения этой проблемы. Один из них - использовать API критериев. В следующем посте есть ответ, который отлично работает: https://stackoverflow.com/a/2937100/670028
Другое решение, которое я нашел благодаря одному из моих полезных сотрудников, которые предложили использовать проекцию LINQ и анонимные типы. Вот решение с помощью LINQ:
var customers = session.Query<Customer>()
.Select(x => new { FullName = x.FirstName + " " + x.LastName, Customer = x })
.Where(x => x.FullName.Contains("Bob Smith"))
.Select(x => x.Customer)
.ToList();
Вы должны использовать 'Restrictions.Like' на проекции, используя concat sqlfunction. Я не думаю, что NH достаточно умен, чтобы построить для вас строчную конкатентную проекцию. – dotjoe
Обновление: я обнаружил, что код NHibernate в этом случае слишком запутан, и просто пошел с хранимой процедурой. Я действительно стараюсь избегать хранимых процедур в максимально возможной степени, но иногда просто проще запускать sql самостоятельно. –