8
votes

Comme opérateur ou en utilisant des caractères génériques à Linq vers des entités

J'utilise Linq 2 entités. Voici le problème: xxx

conversion attendue: comme "% Test% .doc%"

Si c'était Linq 2 SQL, j'aurais pu utiliser SQLMMETHODS. Quelqu'un a répondu dans ma question précédente. Mais maintenant, comme j'utilise L2E et non L2S, j'ai besoin d'une autre solution.


1 commentaires

Pour l'instant, j'ai créé une chaîne SQL de manière dynamique et l'exécute via EXECUTESTOREQUERY et résout mon problème.


6 Réponses :


2
votes

Vous pouvez essayer d'utiliser Cet article , où l'auteur explique comment créer une instruction similaire avec des caractères génériques à Linq aux entités de Linq aux entités.

Editer: puisque le lien d'origine est maintenant mort, voici la classe d'extension d'origine (selon Jon Koeter dans les commentaires ) et exemple d'utilisation. P>

extension: strong> p> xxx pré>

Exemple d'utilisation: strong> p>

string strEmailToFind = "*@yahoo.com"

IQueryable<User> myUsers = entities.Users.WhereLike(u => u.EmailAddress, strEmailToFind, '*');


8 commentaires

J'ai vu cela plus tôt, cela n'a pas d'exemple pour l'utiliser


Voici un exemple: entités.Table.werelike (El => El.position, position, '%'). Vous devez donc définir la colonne que vous recherchiez, modèle à la recherche et au caractère générique. Mais j'ai testé et j'ai trouvé que cela ne vous aidera pas - cela ne traite pas de caractères génériques qui ne sont pas au début ou à la fin du motif, désolé.


Mais comment allez-vous combiner plusieurs clauses? Par exemple, pour générer "où le prénom comme" A% "ou un nom d'attache comme" A% ""?


"Cet article" link TrentaCular.com / 2010/08 / ... est "non trouvé" ... TrentaCular.com montre "Trentatacular. com est presque ici! Téléchargez votre site Web pour commencer. "


Malheureusement, le lien est la pourriture. C'est pourquoi le lien Seule seulement les réponses doivent être évitées


L'article semble être en panne. Vous pouvez afficher ma réponse, dérivé de l'article, ici: Stackoverflow.com/Questtions/2542288/...


Pourquoi je ne peux pas faire .werelike ()? Son rouge souligné. Dois-je importer des classes?


Cela ne fonctionnera pas pour les cas sans fauve sauvage. Dans SQL, c'est insensible à la casse, '=' peut être soit en fonction de la configuration. Si je voulais faire un cas complet de recherche insensible à une recherche insensible, cela ne se traduit pas comme des substituts similaires = à la place.



2
votes

Utilisez une expression régulière ...

Les suivants imprimeront tous les fichiers du répertoire actuel qui correspondent test em> .doc * (style wildcard DOS - ce que vous croyez 'RE Demander) P>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

namespace RegexFileTester
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] _files = Directory.GetFiles(".");
            var _fileMatches =  from i in _files
                                where Regex.IsMatch(i, ".*test*.doc.*")
                                //where Regex.IsMatch(i, ".*cs")
                                select i;
            foreach(var _file in _fileMatches)
            {
                Console.WriteLine(_file);
            }
        }
    }
}


3 commentaires

Non ceci n'est pas requis. Vous obtenez tous les fichiers, puis filtrant cela est un transfert inutile de données.


Quelle est l'alternative? Je viens de faire exactement cela dans mon code, comment puis-je sélectionner et interroger les noms de fichiers en même temps?


Utilisez Directory.EnumerateFiles (chemin, SearchPattern) à la place. (Mais je pense qu'il veut interroger un dB)



2
votes

diviser la chaîne xxx


0 commentaires

3
votes

Suite à partir de la réponse correcte de Magnus, voici une méthode d'extension pouvant être réutilisée, car j'avais besoin dans mon projet.

var terms = "%test%.doc%";
Expression<Func<Doc, bool>> whereClause = d => d;
whereClause = whereClause.WildCardWhere(d => d.docName, terms, '%');
whereClause = whereClause.WildCardWhere(d => d.someOtherProperty, "another%string%of%terms", '%');
var result = ListOfDocs.Where(whereClause).ToList();


1 commentaires

Merci @legolomaniac, c'est une très bonne solution, mais j'ai du mal à l'obtenir pour construire ... Spécifiquement sur `Source = Source.Et (` Cela me dit, "Pas de surcharge pour la méthode" et "prend 1 arguments "



17
votes

La méthode SQL Patindex fournit la même fonctionnalité que similaire. Par conséquent, vous pouvez utiliser sqlfonctions.patidex méthode :

.Where(x => SqlFunctions.PatIndex("%test%.doc%", x.MySearchField) > 0)



0
votes

Alors j'essayais la même chose - essayer de jumeler une liste pour renvoyer tous les candidats correspondant à un SearchTerm. Je le voulais afin que si un utilisateur a dactylographié «Arizona», il restituerait tout ce que vous aviez Arizona. En outre, si l'utilisateur a dactylographié "Arizona cha", il retournerait des articles comme "Changement de licence Arizona". Les suivants ont fonctionné:

private List<Certification> GetCertListBySearchString()
    {
        string[] searchTerms = SearchString.Split(' ');
        List<Certification> allCerts = _context.Certifications.ToList();

        allCerts = searchTerms.Aggregate(allCerts, (current, thisSearchString) => (from ac in current
                                                                                   where ac.Name.ToUpper().Contains(thisSearchString.ToUpper())
                                                                                   select ac).ToList());
          return allCerts;
    }


0 commentaires