2009-11-06 16 views
22

Jak utworzyć tę kwerendę za pomocą NHibernate.Linq?NHibernate.Linq LIKE

WHERE this_.Name LIKE @p0; @p0 = 'test' // Notice NO % wild card 

Uwaga, to nie jest Linq To Sql lub Entity Framework. To jest NHibernate.

EDIT:

Oto pożądane zapytanie wykorzystujące ICriteria:

criteria.Add(Expression.Like("Name", "test")); 
return criteria.List<Theater>(); 

Odpowiedz

6

Z NH 4 (i prawdopodobnie nieco wcześniej), wbudowane przedłużenie stringów Like jest dostępne w przestrzeni nazw NHibernate.Linq: Like(this string matchExpression, string sqlLikePattern). (To jest zdefiniowana w klasie NHibernate.Linq.SqlMethods przedłużacza.)

using NHibernate.Linq; 
... 
session.Query<Theater>() 
    .Where(t => t.Name.Like("test")); 
17

Wierzę, że to jest to, czego szukasz:

var theaters = from theater in Session.Linq<Theater>() 
       where theater.Name.Contains("test") 
       select theater; 

Według moich testów generuje instrukcja SQL 'LIKE': "... GDZIE theater.Name LIKE% test%"

który jest dokładnie wynikiem podanego fragmentu kryteriów.

+1

Korzystanie kryteriów (podanych w pytaniu), ja nie widząc% symbole wieloznaczne są generowane. – mxmissile

+0

Właśnie przeprowadziłem test jednostkowy, który mam z kodem podanym w mojej odpowiedzi i wygenerowałem instrukcję SQL z% wieloznacznym na obu końcach w ciągu znaków. Te same testy przeprowadzam również przy użyciu kryterium equilevant i otrzymuję dokładnie to samo zapytanie SQL, jeśli używam criteria.Add (Expression.Like ("Name", "test", MatchMode.Anywhere)); Używam NHibernate 2.1 z SQL Server 2005. Jeśli używasz tej samej konfiguracji, powinieneś być w stanie zobaczyć te same wyniki. – tolism7

+0

Problem polega na tym, że nie chcę używać symboli wieloznacznych przy użyciu Linq. Mój komentarz powyżej był odpowiedzią na twoją odpowiedź "dokładnie wynik podanego fragmentu kryteriów". Przepraszam, jeśli nie byłam jasna. Mogę osiągnąć pożądane zapytanie z ICriteria, jak podano w pytaniu, ale nie można tego osiągnąć przy użyciu Linq. – mxmissile

15

Miałem ten sam problem w moim projekcie i znalazł rozwiązanie:

session.Linq<Theater>() 
    .Where(x => x.Name.StartsWith("test") && x.Name.EndsWith("test"); 

przekłada SQL do

SELECT ... WHERE Name LIKE '%test' AND Name LIKE 'test%' 
+4

dodatkowo: '&& x.Name.Length ==" test ".Length'. inaczej skończyłoby się na wynikach takich jak 'test bla bla bla test' –

+6

Może brakuje mi punktu, ale na pewno tak naprawdę nie robisz" jak ", ale" równa się ".... Gdzie (X => x.Name.Equals ("test"); –

+0

To rzeczywiście tak, jak powiedział @ n3rd. –

22

Chociaż ten został oznaczony jako rozwiązany, które były poprawne w czasie , mogę również zauważyć, że NHibernate ma teraz kilka rozszerzeń, więc możesz wykonać następujące czynności:

Session.QueryOver<MyEntity>() 
    .Where(x => x.Property.IsLike("something", MatchMode.Anywhere)) 
    .List(); 

Thi s zrobi dla ciebie LIKE '%something%'.

+1

To są gotowe, nawiasem mówiąc, nie robione na zamówienie – Kezzer

+0

+1 dokładnie to, czego szukałem dla, może warto zwrócić uwagę, aby rozwiązać dokładnie problem powyżej chcesz użyć MatchMode.Exact (nie% wieloznaczne) – PJUK

+0

Musiał dodać 'przy użyciu NHibernate.Criterion;', gdy nie używasz Resharper.Ale działa świetnie! Dzięki. –