2017-09-06 1 views
0

J'essaye de construire la clause sql where à partir d'un prédicat de fonction. Ce que je suis en train de réaliser ressemble à ce qui suit:Est-il possible de construire une clause SQL à partir d'un prédicat de fonction C#?

public IEnumerable<TDbEntity> Query(Func<TDbEntity, bool> predicate) 
{ 
// TODO: to build whereCondText from predicate 
var whereCondText = ""; 
var sql = "SELECT * FROM TABLE WHERE " + whereCondText; 
return DB.Connection.Query<TDbEntity>(sql); 
} 
+0

J'utilise dapper. – Tushar

+0

Est-ce que https://github.com/tmsmith/Dapper-Extensions/https://github.com/tmsmith/Dapper-Extensions/wiki/Predicates aide? – mjwills

+0

La chose que vous voulez faire est exactement ce que font les ORM mais à la place des délégués, ils le font à partir de 'Expression'. Donc, pour répondre à votre question: oui, vous pouvez le faire avec 'Expression' mais ce n'est pas facile. Une meilleure question est pourquoi vous voulez faire cela si les ORM peuvent déjà le faire? – CodingYoshi

Répondre

0

Vous pouvez le faire, mais le prédicat devrait être sous la forme de Expression<Func<TDbEntity, bool>>. Cela indique au compilateur de construire une représentation AST de votre code au lieu d'émettre l'IL pour le code. Vous pouvez ensuite utiliser ExpressionVisitor pour parcourir l'arborescence et créer le prédicat.

Ce n'est pas une tâche triviale. Vous êtes probablement mieux d'utiliser Entity Framework ou Draper ou nHibernate. Pour une expression simple, vous pourriez être en mesure de faire un travail décent.

+0

Pouvez-vous partager des exemples de code? – Tushar

+0

Pas vraiment, j'ai utilisé 'ExpressionVisitor' mais ce n'est pas une tâche triviale d'accomplir une transformation Expression tree vers SQL, cela dépend de la manière dont vous mappez votre classe aux tables et colonnes SQL. Encore une fois ORM est probablement meilleur pour vous –

+0

Ce serait le document standard pour ceci: https://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx –