是否有可能从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);
}
你可以这样做,但谓语必须是在Expression<Func<TDbEntity, bool>>
形式。这告诉编译器为您的代码构建AST表示,而不是为代码发送IL。然后,您可以使用ExpressionVisitor
来遍历树并创建谓词。
这不是一项简单的任务。你可能更适合使用Entity Framework或Draper或nHibernate。为了简单表达,你可能会做一份体面的工作。
你能分享一些代码示例吗? – Tushar
不是真的,我已经使用了'ExpressionVisitor',但是完成表达式树到SQL转换并不是一项简单的任务,它取决于您如何将类映射到SQL表和列......再次,ORM对您来说可能更好 –
这将是这个标准的文档:https://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx –
我正在使用小巧玲珑。 – Tushar
https://github.com/tmsmith/Dapper-Extensions/ https://github.com/tmsmith/Dapper-Extensions/wiki/Predicates是否有帮助? – mjwills
你想要做的事情正是ORM所做的事情,而不是委托,他们从'表达式'做它。所以要回答你的问题:是的,你可以用'Expression'来做到这一点,但这并不容易。更好的问题是,如果ORM可以做到这一点,为什么要这么做呢? – CodingYoshi