LINQ to Entity, à l'aide d'un opérateur SQL LIKE

asp.net-mvc entity-framework linq-to-entities

Question

J'ai une requête LINQ to ENTITY extraite d'une table, mais je dois être capable de créer une recherche de type "floue". J'ai donc besoin d'ajouter une clause where qui recherche par nom de famille SI ils ajoutent les critères dans la zone de recherche (Zone de texte, PEUT être vide --- auquel cas, elle affiche TOUT).

Voici ce que j'ai jusqu'à présent:

    var query = from mem in context.Member
                orderby mem.LastName, mem.FirstName
                select new
                {
                    FirstName = mem.FirstName,
                    LastName = mem.LastName,

                };

Cela va tout extraire de la table des membres qui est dans l'objet Entity.

Ensuite, j'ai un ajout à la logique:

sLastName = formCollection["FuzzyLastName"].ToString();

if (!String.IsNullOrEmpty(sLastName))
   query = query.Where(ln => ln.LastName.Contains(sLastName));

Le problème est que lorsque le bouton de recherche est pressé, rien n'est renvoyé (0 résultats). J'ai exécuté la requête sur le serveur SQL que j'espère voir se produire ici et renvoie 6 résultats.

C'est la requête que j'attends:

SELECT mem.LastName, mem.FirstName FROM Members mem WHERE mem.LastName LIKE '%xxx%'

(lorsque xxx est entré dans la zone de texte)

Quelqu'un voit quelque chose de mal avec ça?

EDIT: Correction de la requête SELECT. Je voulais dire qu'il se lise comme "% xxx%" (NOT = "xxx")

Réponse acceptée

Je pense que vous voulez utiliser la fonction Contains() du paramètre string comme ceci:

var query = from mem in context.Member
    where mem.LastName.Contains("xxx")
    orderby mem.LastName, mem.FirstName
    select new
    {
        FirstName = mem.FirstName,
        LastName = mem.LastName,
    };

Je pense que vous pouvez également utiliser StartsWith() et EndsWith() qui seraient équivalents aux SQL 'xxx%' et '% xxx "respectivement


Réponse populaire

Ajoutez votre "select new" à la requête uniquement après avoir ajouté votre clause "Where".

Ajoutez donc votre clause select en utilisant la syntaxe d'appel d'objet comme vous l'avez fait avec la clause where.

Non testé, veuillez excuser les petites erreurs, mais le concept général serait ....

   using( someContent sc = new someContent())
   {
      var query = sc.Member.OrderBy( i => i.LastName)
                    .ThenBy( i => i.FirstName);

      sLastName = formCollection["FuzzyLastName"].ToString();

      if (!String.IsNullOrEmpty(sLastName))
          query = query.Where(ln => ln.LastName.Contains(sLastName));

      query = query.Select( i => new
                {
                    FirstName = i.FirstName,
                    LastName = i.LastName,

                });
    }


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow