是否有可能从C#函数谓词中构建SQL where子句?

问题描述:

我想从函数谓词中建立sql where子句。我想实现看起来如下:是否有可能从C#函数谓词中构建SQL where子句?

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

我正在使用小巧玲珑。 – Tushar

+0

https://github.com/tmsmith/Dapper-Extensions/ https://github.com/tmsmith/Dapper-Extensions/wiki/Predicates是否有帮助? – mjwills

+0

你想要做的事情正是ORM所做的事情,而不是委托,他们从'表达式'做它。所以要回答你的问题:是的,你可以用'Expression'来做到这一点,但这并不容易。更好的问题是,如果ORM可以做到这一点,为什么要这么做呢? – CodingYoshi

你可以这样做,但谓语必须是在Expression<Func<TDbEntity, bool>>形式。这告诉编译器为您的代码构建AST表示,而不是为代码发送IL。然后,您可以使用ExpressionVisitor来遍历树并创建谓词。

这不是一项简单的任务。你可能更适合使用Entity Framework或Draper或nHibernate。为了简单表达,你可能会做一份体面的工作。

+0

你能分享一些代码示例吗? – Tushar

+0

不是真的,我已经使用了'ExpressionVisitor',但是完成表达式树到SQL转换并不是一项简单的任务,它取决于您如何将类映射到SQL表和列......再次,ORM对您来说可能更好 –

+0

这将是这个标准的文档:https://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx –