2

Par exemple, étant donné le code suivant, comment est-il possible de faire la comparaison de chaînes insensibles à la casse?Comment faire un cas insenstive clause where dans LINQ to NHibernate avec le fournisseur Oracle?

 var query = from employeeGroup in _session.Linq<EmployeeGroup>() 
        from employee in employeeGroup.Employee 
        where employee.UserName == username 
        select employeeGroup.EmployeeGroupName; 

La méthode NHibernate.Linq.SqlClient.SqlClientExtensions.Upper() peut aider, mais cela ne semble être disponible avec SQL Server.

Si j'utilise la classe System.String pour faire la comparaison, je reçois une erreur: « Impossible d'utiliser les sous-requêtes sur un critère sans projection. ». Je crois que c'est parce qu'il n'y a pas de mappage direct que NHibernate peut faire à SQL.

+0

Dans la version actuelle, ce devrait maintenant être pris en charge. http://nhforge.org/blogs/nhibernate/archive/2009/12/17/linq-to-nhibernate-progress-report-a-christmas-gift.aspx – Rashack

Répondre

3

Pour autant que je peux dire, NHibernate Linq does not support cas correspondant insensible. Ce n'est pas un problème pour SQL Server qui est insensible à la casse mais qui est évidemment pour Oracle. Je pense que vous devrez utiliser l'API Criteria ou HQL pour cela.

+0

Je suis en désaccord. S'il vous plaît voir "IsInsensitiveLike" option ci-dessous. – Jeff

0

Juste pour référence, voici un exemple de l'API Critères:

session.CreateCriteria(typeof(Customer)) 
    .Add(new Expression.EqExpression("Firstname", "John", true)) 
    .List<Customer>(); 

Le paramètre booléen à la fin de la méthode EqExpression détermine insensibilité à la casse.

+3

Il semble que ce soit obsolète dans NHibernate 2 - cette expression a été remplacée par InsensitiveLike. –

0

Lorsque vous utilisez NHibernate QueryOver, vous pouvez utiliser IsInsensitiveLike avec MatchMode.Exact. Cela en fait un match insensible à la casse, et la « Exact » signifie qu'il correspondra à « John » exactement par rapport conclusion « Johnson », etc.

var foo = session.QueryOver<Customer>() 
    .Where(x => x.Firstname.IsInsensitiveLike("John", MatchMode.Exact)).List();