IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[Linq To SQL] [C#] Clause Like


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Par défaut [Linq To SQL] [C#] Clause Like
    Bonjour,

    Avec Linq To SQL j'avais l'habitude de faire des requêtes de recherches tel que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var q = from p in MonDataContext.Product
               where p.ProductName.Contains(mavariable)
               select p;
    Où "mavariable" est une variable de type string, et en général la requête retourne tous les enregistrements dont le champ ProductName contient la valeur de mavariable. Cela fonctionne aussi très bien si mavariable contient une chaine vide, ce qui retourne en fait TOUS les enregistrements de la table.

    Or depuis que je suis passé à Entity Framework et qu'au lieu de faire ma requête avec Linq sur mon datacontext, je le fais contre un "Entities". Et là cela marche pareil hormis lorsque mavariable contient une chaine vide, cela ne retourne aucun enregistrement ?

    Pourquoi ? Et comment puis je continuer à utiliser cette fonctionnalité ?

    La table ne contient pas plus de 1000 enregistrements donc le côté soucis de performance importe peu, je peux donc me permettre de tout afficher

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Le pourquoi, je ne saurais pas te dire mais te proposer une alternative, c'est possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where mavariable == null || p.ProductName.Contains(mavariable)

  3. #3
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Bonjour,

    Tu peux avoir un aperçu de la requête reçu par SQL Serveur avec SQL Server Profiler. Surement que la requête généré par Entity Framework n'est pas la même qu'avec LinQ To SQL.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Par défaut
    Citation Envoyé par Jérôme Lambert Voir le message
    Le pourquoi, je ne saurais pas te dire mais te proposer une alternative, c'est possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where mavariable == null || p.ProductName.Contains(mavariable)
    J'ai essayé, ça marche nickel.
    Mais y a pas une solution plus "propre" ?


    Citation Envoyé par Paul Musso Voir le message
    Bonjour,

    Tu peux avoir un aperçu de la requête reçu par SQL Serveur avec SQL Server Profiler. Surement que la requête généré par Entity Framework n'est pas la même qu'avec LinQ To SQL.
    Je travailles sur la version Express de SQL Server, et il me semble pas que ce soit disponible le Profiler, mais effectivement ça m'aurait aider à voir comment il fonctionne. Je vais peut être tester ça du boulot, merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Par défaut
    Voilà ce que cela donne avec Profiler sur une DB Northwind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    string mavariable = '';
     
    var q = from a in db.Customers
               where a.ContactName.Contains(mavariable)
               select a;
     
    exec sp_executesql N'SELECT 
    [Extent1].[CustomerID] AS [CustomerID], 
    [Extent1].[CompanyName] AS [CompanyName], 
    [Extent1].[ContactName] AS [ContactName], 
    [Extent1].[ContactTitle] AS [ContactTitle], 
    [Extent1].[Address] AS [Address], 
    [Extent1].[City] AS [City], 
    [Extent1].[Region] AS [Region], 
    [Extent1].[PostalCode] AS [PostalCode], 
    [Extent1].[Country] AS [Country], 
    [Extent1].[Phone] AS [Phone], 
    [Extent1].[Fax] AS [Fax]
    FROM [dbo].[Customers] AS [Extent1]
    WHERE (CAST(CHARINDEX(@p__linq__13, [Extent1].[ContactName]) AS int)) > 0',N'@p__linq__13 nvarchar(4000)',@p__linq__13=N''
    Donc du coup je comprends pourquoi cela ne fonctionne pas avec une chaine vide. Je ne comprends pas trop la raison d'utiliser ce CHARINDEX au lieu d'un tout bête LIKE... Performance ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Par défaut
    Pour aller au bout des choses, j'ai généré un DataContext (via SqlMetal.exe).
    Si je me trompes pas ça sera du LinqToSql (DataContext) au lieu de LinqToEntities (EDM)
    Avec L2S le Profiler m'indique que la requête SQL est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    exec sp_executesql N'SELECT 
    [t0].[CustomerID], 
    [t0].[CompanyName], 
    [t0].[ContactName], 
    [t0].[ContactTitle], 
    [t0].[Address], 
    [t0].[City], 
    [t0].[Region], 
    [t0].[PostalCode], 
    [t0].[Country], 
    [t0].[Phone], 
    [t0].[Fax]
    FROM [dbo].[Customers] AS [t0]
    WHERE [t0].[ContactName] LIKE @p0',N'@p0 nvarchar(3)',@p0=N'%a%'
    La différence se situe sur la condition WHERE, où L2S utilise un LIKE et où L2E utilise un CHARINDEX.
    Si quelqu'un en connait la raison, je suis preneur...

Discussions similaires

  1. [LINQ To SQL] Clauses WHERE dynamiques
    Par SaumonAgile dans le forum Accès aux données
    Réponses: 7
    Dernier message: 23/02/2008, 01h11
  2. [XPath] équivalent clause LIKE sql
    Par mapmip dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 04/01/2007, 10h44
  3. clause LIKE avec 1 champ SQL
    Par tamishrim dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/05/2006, 18h30
  4. Requete SQL croisée avec la clause Like
    Par Orgied dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/03/2006, 16h36
  5. SQL Access: clause like?
    Par rapace dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/02/2006, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo