Próbuję przekonwertować następujący kod SQL w NHibernate:Fuzzy Szukaj w łączonych Pełna nazwa użyciu NHibernate
SELECT * FROM dbo.Customer
WHERE FirstName + ' ' + LastName LIKE '%' + 'bob smith' + '%'
Starałem się zrobić coś takiego, ale to nie działa:
name = "%" + name + "%";
var customers = _session.QueryOver<Customer>()
.Where(NHibernate.Criterion.Restrictions.On<Customer>(c => c.FirstName + ' ' + c.LastName).IsLike(name))
.List();
Co zasadniczo próbuję zrobić, to móc wyszukać nazwisko klienta w polu tekstowym z przykładową wartością "bob smith" i przeszukać bazę danych za pomocą wyrażenia LIKE w powyższym SQL.
Jeśli chodzi o wyszukiwanie kolumn FirstName i LastName błędnie, proszę, pomóżcie mi z alternatywą, ale powyższe zapytanie SQL zapewnia mi to, czego potrzebuję.
Aktualizacja z 2 rozwiązań:
Tak już teraz znaleźć dwa rozwiązania tego problemu. Jednym z nich jest użycie API Criteria. Poniższy post ma odpowiedź, która działa świetnie: https://stackoverflow.com/a/2937100/670028
Inne rozwiązanie znalazłem dzięki jednemu z moich pomocnych współpracowników, którzy zasugerowali użycie projekcji LINQ i typów anonimowych. Oto rozwiązanie przy użyciu 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();
Będziesz musiał użyć 'Ograniczenia.Lika' na Projekcji przy użyciu funkcji concat. Nie sądzę, że NH jest wystarczająco inteligentny, aby zbudować dla ciebie projekcję concat. – dotjoe
Aktualizacja: Zauważyłem, że kod NHibernate jest po prostu zbyt brudny w tym przypadku i poszedł po procedurze przechowywanej. Naprawdę staram się unikać procedur przechowywanych tak często, jak to możliwe, ale czasami łatwiej jest uruchomić obsługę sql. –