0

Je travaille avec un générateur d'arbre d'expression très basique pour créer des expressions SQL.Expression permettant de comparer les propriétés Guid par rapport aux valeurs String puis de traduire en TSQL

Par exemple, pour créer une expression pour une classe hypothétique User comparant une propriété String appelé « Nom » par rapport à une valeur String « john », j'utilise un morceau de code similaire à ceci:

var propertyInfo = typeOf(User).GetProperties().First(p=>p.Name=="Name"); 

Expression.Call(
    Expression.Property(Expression.Parameter(typeof(User), "val"), propertyInfo), 
    typeof(string).GetMethod("Contains"), 
    Expression.Constant("john") 
) 

Ce qui génère (après quelques lignes de code et EF intervention) quelque chose de similaire à:

[...] Name LIKE '%john%' [...] 

Mon problème est avec Guid propriétés ...

Je ne peux pas figurés comment devrait construire l'expression de comparer une propriété Guid par rapport à une valeur String, pour générer une très simple SQL requête similaire à:

[...] Id='38EB4D06-E50B-4C7A-80FF-A6350051682A' [...] 

Je ne peux pas utiliser la méthode Equals entre Guid et String. .. Im vraiment aucune idée, sera bien reçu toute suggestion ...

+0

Vous pouvez essayer 'ToString()' pour convertir le Guid à une chaîne –

+0

j'ai essayé avec [SqlFunctions.StringConvert] (http://msdn.microsoft.com/en-us/library/dd466166.aspx) parce que ' ToString() '[n'est pas implémenté sur LinQ for Entities Query] (http://stackoverflow.com/questions/26146272/cant-use-tostring-in-linq-to-entities-query), mais accepte uniquement les nombres en tant que paramètres ... –

Répondre

2

Cela devrait fonctionner:

var propertyInfo = typeof(Entity).GetProperties().First(p => p.Name == "Id");  

    var paramExpr = Expression.Parameter(typeof(Entity)); 
    var propertyAccessExpr = Expression.MakeMemberAccess(paramExpr, propertyInfo); 
    var guidExpr = Expression.Constant(Guid.Parse("38EB4D06-E50B-4C7A-80FF-A6350051682A")); 
    var body = Expression.Equal(propertyAccessExpr, guidExpr); 
    var lambda = Expression.Lambda<Func<Entity, bool>>(body, paramExpr); 

    Console.WriteLine(lambda); // Param_0 => (Param_0.Id == 38eb4d06-e50b-4c7a-80ff-a6350051682a) 

Entity est:

public class Entity 
{ 
    public Guid Id { get; set; } 
} 

Fiddle.

+0

Fonctionne comme un charme @Dennis !, fondamentalement 'Expression.Constant (Guid.Parse (" 38EB4D06-E50B-4C7A-80FF-A6350051682A "))' était la partie _magic_ ... Thx! –

+0

@ SebastiánGuerrero: de rien. – Dennis