LINQ e operatore sql LIKE standard

giovedì 07 febbraio 2013 - 11.35
Tag Elenco Tags  C#  |  .NET 3.5  |  Oracle 10g

volperubbia Profilo | Senior Member

Ciao a tutti,
vorrei ottenere con LINQ (uso FluentNHibernate su db Oracle) l'equivalente delle query sql che usano l'operatore LIKE ...

SELECT * FROM TBL WHERE COLUMN1 LIKE 'da%';
SELECT * FROM TBL WHERE COLUMN1 LIKE 'da%oni';
SELECT * FROM TBL WHERE COLUMN1 LIKE '%lla';

L'operatore Contains, Context.Of<MyClass>().Where(x => x.Column1.Contains("da")), genera in realtà la query
SELECT * FROM TBL WHERE COLUMN1 LIKE '%da%' e questo non è esattamente il risultato delle query.

Qualche idea su come realizzare la cosa?
Davide

alx_81 Profilo | Guru

>Ciao a tutti,
ciao

>L'operatore Contains, Context.Of<MyClass>().Where(x =>
>x.Column1.Contains("da")), genera in realtà la query
>SELECT * FROM TBL WHERE COLUMN1 LIKE '%da%' e questo non è esattamente
>il risultato delle query.
>Qualche idea su come realizzare la cosa?
hai provato ad usare invece che contains, StartsWith e EndsWith?
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

volperubbia Profilo | Senior Member

Ciao Alessandro,
si sì ... tartsWith e EndsWith funzionano ... ma perdo un po' di genericità, meglio il contains.
In alcune / pochissime pagine di ricerca uso LINQ / PredicateBuilder (non ho quindi accesso diretto all'sql) e sui filtri di testo libero l'utente può metterci o meno quanti * vuole e in qualsiasi posizione. Quando l'utente mette almeno un * vorrei ''tradurre'' con un like, in caso contrario con l'uguale.

Sto guardando un po' in rete ... se risolvo ti dico. Il contains non è precisissimo, ma fa il suo lavoro e se un utente non è particolarmente attento di questa imperfezione non si accorge. Lo sviluppatore sì :-).

Davide

andrestu Profilo | Expert

perchè non ti crei una funzione customizzata da far girare all'interno del where ?


Andrea Restucci - Web Developer

volperubbia Profilo | Senior Member

Ciao a tutti,
ho risolto con un LIKE ad hoc, in allegato, anche se non è perfettissimo, copre moltissimi casi.

var Predicate = PredicateBuilder.True<User>();
Predicate = Predicate.AndAlsoLike(x => x.Name, "da*");
var obj = Context.Of<User>().Where(Predicate);

L'unica pecca è che il StringComparison.InvariantCultureIgnoreCase non da segni di vita, ma credo dipenda da Oracle e me ne ero già accorto tempo fa. Ho risolto creando un campo LowerName mappato con Map(x => x.LowerName).Formula("LOWER(UTENTE)").

Davide

andrestu Profilo | Expert

bello l'utilizzo di questo predicato, non lo conoscevo, io ho sempre fatto a mano:

Func<string, bool> MyPred = (X) =>
{
logica di controllo
return true o false in base alla logica
};

scusa ma qualè il namespace per l'oggetto Expression ?

Andrea Restucci - Web Developer

volperubbia Profilo | Senior Member

System.Linq.Expressions.
Sotto su VS.2008 / .NET 3.5.

Ciao,
Davide
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5