0 votes

Linq.Where-to-SQL sur un champ de texte comparant à une liste de valeurs

Customer.text est un champ dans une base de données T-SQL (que je ne contrôle pas et que je ne peux donc pas modifier) de type "text".

J'aimerais faire quelque chose comme ça :

List<string> compare = new List<string>();
compare.Add("one");
compare.Add("two");

var q = from t in customer
        where t.text.Contains( compare.First())
        select t;

ça va marcher.

Mais maintenant j'aimerais faire quelque chose comme : (!NE FONCTIONNE PAS !)

var q = from t in customer
        where compare.Contains( t.text )
        select t;

Comment puis-je y parvenir ? Est-ce même possible ?

EDIT : Le problème n'est évidemment pas très clair : une colonne de texte en SQL ne peut pas être interrogée en utilisant "=" mais seulement avec LIKE. Ainsi, la fonction compare.Contains( t.text ) entraînera une erreur, car elle est convertie en une requête utilisant "=".

Ce que je n'ai pas dit - je pensais que c'était sans importance - c'est que j'utilise LINQ-to-ORM (LLBLGen dans ce cas). Ce que j'ai essayé à la place :

var q = from t in customer
        where compare.Any( x => t.text.Contains(x) )
        select t;

Cela n'a pas fonctionné non plus. Je ne suis pas au travail pour le moment, mais l'exception concernait une expression constante qui ne pouvait pas être convertie en une expression fixe.

J'espère que cela a apporté quelques éclaircissements.

EDIT2 :

Joseph me l'a fait remarquer : PredicateBuilder . Il crée une expression sur un type d'objet donné. Mon problème est que mon type est un type anonyme issu de jointures multiples. Existe-t-il un moyen simple ou élégant de gérer cela ?

1voto

Andomar Points 115404

Il se peut que je rate quelque chose, mais votre code semble devoir fonctionner. Avez-vous inclus les espaces de noms en haut du fichier ?

using System.Linq;
using System.Linq.Expressions;

Vous pourriez aussi le réécrire sans la syntaxe Linq2Sql, comme :

var q = customer.Where(c => compare.Contains(c.text));

1voto

Christopher Biggs Points 211

Vous pouvez construire votre requête en utilisant la classe gratuite de construction de prédicats de LinqKit. Voici un article de blog qui décrit son utilisation et contient un lien vers le site de téléchargement.

http://thecodeslinger.wordpress.com/2008/10/28/linqkit-predicatebuildert-goodness/

Voici un exemple de code tiré de l'article

    //First get a list of keywords that match the description entered.
                string[] parts = txtInclude.Text.Split(new[] {‘ ‘});
                string[] noparts = null;
                if(txtButNot.Text.Trim().Length > 0)
                    noparts = txtExclude.Text.Trim().Split(new[] {‘ ‘});

                var pred = PredicateBuilder.True<Pet>();
   //here is where you would loop through your compare object
                parts.ForEach(p => pred = pred.And(pl => pl.description.Contains(p)));
                if(noparts != null)
                    noparts.ForEach(p => pred = pred.And(pl => !pl.description.Contains(p)));

                var pets = from s in db.Pets.Where(pred)
                        select s;

0voto

Christopher Biggs Points 211

Vous devez convertir le champ de texte en chaîne de caractères

        var query = from t in dataContext.table
                    where compare.Contains(t.textField.ToString())
                    select t;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X