7
votes

Linq sqlmethods

Je suis sur les conseils Ici , essayant de tirer parti de la déclaration que le SQL ne se crée pas tant que l'énumérateur n'est pas trébuché. Cependant, je reçois l'erreur suivante sur le code ci-dessous. J'utilise Linq2ENTités, pas LINQ2SQL. Y a-t-il un moyen de le faire dans Linq2entivies?

méthode 'boolean comme (system.string, system.string)' ne peut pas être utilisé sur le client; C'est uniquement pour la translation sur SQL. xxx

notes: dB est une mappage d'entité sur un serveur SQL.


0 commentaires

5 Réponses :


4
votes

vous pouvez faire esql et faire quelque chose comme le ci-dessous ..

     db.MyTables.Where("it.Type like '" + typeFilter + "'").ToList();


3 commentaires

Cela ne compile pas sur le mien (même l'ajout du manquant +). Je suis dans vs2008, .NET 3.5 SP1


Nevermind, il doit aller spécifiquement directement à la table, pas plus tard Ienumerable. Merci.


Maintenant, il suffit de «nom de terrain» ne pouvait pas être résolu dans la portée ou le contexte actuel.



4
votes

the sqlmethods La classe est destinée à être utilisée avec LINQ-TO-SQL. Lorsque vous utilisez des méthodes à partir de celui-ci (que la documentation publique vous dit de ne pas faire, ce n'est pas la consommation publique), le iquéryable fournisseur pour Linq-to-entités ne sait pas quoi faire avec cela ni la traduire.

Si vous avez eu une seule base générique au début ou à la fin du filtre, vous pouvez utiliser startswith ou Endswith méthodes sur la chaîne La classe classe et Linq-to-entités supporteront cela.

Cependant, dans ce cas, vous avez un nombre variable de caractères génériques, vous devrez donc tomber au niveau ESQL et construire une requête à partir de celle indiquée dans La réponse de Nix .


0 commentaires

12
votes

Je ne sais pas comment vous pouvez faire un cadre d'entité utilise l'opérateur "réel", mais une solution de contournement éventuelle serait d'exprimer une expression similaire en termes de startswith , contient < / code> et findswith

par exemple: xxx

et ainsi de suite ...

Notez que ce n'est pas 'T exactement équivalent à l'utilisation de comme dans SQL: par exemple comme'% ABC% BCD% ' donnerait à contient ("ABC") && contient ("BCD") . Cela correspondrait à "ABCD" même si l'état original de la forme. Mais pour la plupart des cas, il devrait être assez bon.

Voici un exemple de mise en œuvre, en utilisant prédicatbuilder et Linqkit pour construire expressions basées sur un modèle similaire: xxx

et voici comment vous pouvez l'utiliser: xxx

Je viens de l'essayer avec Un simple modèle EF, et il semble fonctionner correctement :)


2 commentaires

Malheureusement, j'ai besoin de "comme", mais c'est une solution intéressante.


Approche intéressante, bien que comme '% a% b%' => startswith ("a") && contient ("B") n'est pas vrai, car vous avez trop de pour cent au début. comme 'A% B%' est meilleur.



0
votes

Vous pouvez utiliser un véritable comme dans un lien vers des entités

Ajouter P>

public static class Extensions
{
    [EdmFunction("DocTrails3.Net.Database.Models", "String_Like")]
    public static Boolean Like(this String searchingIn, String lookingFor)
    {
        throw new Exception("Not implemented");
    }
}


0 commentaires

0
votes

J'ai posté Ma solution ici , juste au cas où ici le cas est aussi:

Mise à jour de 2019 H3>

pour l'entité framework 6.2 Vous pouvez utiliser DBFonctions P>

Par exemple: P>

try
{
    using (var db = new YOUREntities())
    {
        var data = db.LenderProgram.Where(i => DbFunctions.Like(i.LenderProgramCode, "OTO%"))
            .ToList();
        return data;
    }
}
catch (Exception e)
{
    e.HandleException();
}


0 commentaires