7
votes

Comment convertir une expression Lambda en SQL?

Je développe un petit cadre pour accéder à la base de données. Je veux ajouter une fonctionnalité qui fait une requête en utilisant une expression de Lambda. Comment puis-je faire cela? XXX PRE>

Par exemple: P>

var repo = new Repository<TestModel>();

var query = repo.AsQueryable().Where(x => x.Name == "test"); 
// This query must be like this:
// SELECT * FROM testmodel WHERE name = 'test'

var list = query.ToDataSet();
// When I call ToDataSet(), it will get the dataset after running the made query.


9 commentaires

Linqpad.net pourrait vous aider.


Vous devez utiliser un cadre O / RM qui permet à Linq sur les expressions, telles que LINQ au cadre SQL ou entité.


Voulez-vous mettre en place un Fournisseur de requête ?


Utilisez Linqpad pour en savoir plus à ce sujet.


@Steven je ne veux pas utiliser un orm. Puis-je faire sans utiliser orm?


@Phg j'ai regardé au fournisseur de requêtes. Il semble complexe. Cela peut me servir. Mais je ne sais pas comment l'utiliser. Pouvez-vous me montrer un exemple?


@sinanakyazici: écrire votre propre fournisseur de requêtes est extrêmement complexe !! Ne gaspillez pas votre argent d'argent en écrivant le vôtre. Vous échouerez de toute façon. Travaillez simplement avec la première version de l'entité Framework (.NET 3.5) (et découvrez la quantité d'EF1 suce) pour comprendre à quel point il est complexe d'écrire votre propre moteur qui permet de convertir des arbres d'expression à SQL.


C'est lourd des choses lourdes, en effet. Ce tutoriel semblait très bon pour moi, mais c'est très détaillé. Assurez-vous de comprendre comment IQuérable fonctionne vraiment au début. J'essaierais aussi quelque chose de plus simple que d'analyser les expressions au début, par exemple. Utilisation d'un fournisseur de linq interne sur SQL pour simuler le iQuiserable .


Pour avoir une idée des profondeurs de Linq, allez regarder Ceci .


3 Réponses :


16
votes

continuer et créer un fournisseur LINQ (je suis sûr que Vous ne voulez pas faire cela, de toute façon).

C'est beaucoup de travail, alors peut-être que vous voulez juste utiliser NHibernate ou Frame-entité ou quelque chose comme ça.

Si vos requêtes sont plutôt simples, vous n'avez peut-être pas besoin d'un fournisseur de linq époustouflé complet. Regardez Arbres d'expression (qui sont utilisés par des fournisseurs Linq).

Vous pouvez pirater quelque chose comme ceci: xxx

s'il vous plaît, don ' t Utilisez ceci tel quel. Il s'agit simplement d'un exemple rapide et sale de la manière dont les arbres d'expression peuvent être analysés pour créer des instructions SQL.

Pourquoi pas simplement utiliser Linq2SQL, NHibernate ou EntityFramework ...


6 commentaires

J'ai essayé d'utiliser Linq Fournisseur. J'ai expliqué. Mais ça n'a pas fonctionné. Il y a trop de cours. Ne faisais pas de manière plus simple?


@sinanakyazicii j'ai ajouté un exemple simple pour que vous puissiez avoir l'idée


@sinanakyazici Oui, la création d'un fournisseur LINQ est complexe. C'est pourquoi les gens n'écrivent pas leur propre s'ils ne doivent pas nécessairement, mais utiliser des utilisations existantes.


Merci beaucoup. Vous avez écrit un autre où (). Mais je veux utiliser où () de Linq. Donc, vous avez écrit inutile pour moi. Vraisemblablement, je peux faire avec le fournisseur Linq.


Pourquoi ne les utilise-je pas (Linq2sql, NHibernate et EntityFr)? Béacuse j'ai déjà écrit dans mon ormes. Donc je n'ai pas besoin de les eux.


+1 Bien que cela ne fonctionnerait que avec des opérateurs arithmétiques. Cela échouerait toutefois si l'opération.NodeType est un appel. Par exemple, cet appel d'égalité ne fonctionnera pas: e => e.name.equals ("test")




0
votes

Vous voudrez peut-être regarder http://iqtoolkit.codeplex.com/ qui est très complexe et Je ne vous recommande pas de construire quelque chose à partir de zéro.

Je viens d'écrire quelque chose près de la réponse de Dkons, je l'ajouterai de toute façon. Il suffit d'utiliser une interface fluide rien de plus. P>

static void Main(string[] args)
        {

            Model m = new Model() {Name = "n", Surname = "s"};
            var q = new Query<Model>();
            q.Eq(x => x.Name).Like(x=>x.Surname).Run(m);


        }


2 commentaires

Propriété.name est toujours null. Afin de l'extraire, vous devrez procéder comme suit: Var Expression = (MemBeExpression) Propriété.bon; Nom de la chaîne = expression.member.name;


Et une autre chose est que vous pouvez utiliser dic penser si vous avez "comme" deux fois, que se passera alors