Expressiontree到SQL的通用解析

时间:2010-12-14 20:19:20

标签: c# sql linq expression-trees

所以,我有这个非常简单的linq提供程序,可以在一个小的约束域中处理对象。不需要完整的Linq2Sql实现,但我需要做的一些事情涉及sql查询。我的理由是,如果你远离表格和列名,大多数表达式树=> sql必须非常(非常)通用。

Expression<Func<DateTime, bool>> expr = d => d.DateTime.Month == 1

将始终转换为

DATEPART({0}, m) = 1

Expression<Func<DateTime?, bool>> expr = d => d.HasValue || d ==  DateTime.Now

{0} IS NOT NULL OR {0} = NOW()

希望你明白这一点。是否有像这样的通用sql生成器?

2 个答案:

答案 0 :(得分:1)

嘿嘿,我们不只是懒散地瞎逛?所以,它还没有完全正常工作,我需要弄清楚如何动态注入一些映射信息,但到目前为止它看起来很有希望。

我已经能够制作这个sql

SELECT t0.[Born], t0.[Yo]
FROM [Heies] AS t0
WHERE ((MONTH(t0.[Born]) = 1) OR (NOT (t0.[Yo] IS NULL OR t0.[Yo] = '') AND (t0.
[Born] = @p0)))

使用此代码

var provider = new DbEntityProvider(new SqlConnection(), new TSqlLanguage(), new ImplicitMapping(), new QueryPolicy());
var exp = provider.GetTable<Hey>().Where(d => d.Born.Month == 1 || (!String.IsNullOrEmpty(d.Yo) && d.Born == DateTime.Now)).Expression;
var sql = ((QueryProvider)provider).GetQueryText(exp);

使用IQToolkit,感谢Damian再次提醒我!如果有人有类似的方法通过Linq2Sql生成sql,我很乐意听取你的意见,这样我就可以放弃对IQToolkit的依赖。

<强>更新

经过大量的愚弄,我已经在提取每个参数的值时碰壁了。经过大量的源代码阅读后,它似乎隐藏了很远的查询实际执行情况。好吧,猜猜看,我不希望执行查询:/

在查看Linq2Sql后,我想出了大致相同的代码,所以也许我应该坚持使用

var xml = Generate<NewsProperty>();
var mapping = XmlMappingSource.FromUrl(xml);
var ctx = new DataContext(new SqlConnection("..."), mapping);

var query = ctx.GetTable<NewsProperty>().Where(n => n.Date.Year == 2010).OrderBy(n => n.Date).Take(5);
var cmd = ctx.GetCommand(query);
string sql = cmd.CommandText;

foreach (DbParameter param in cmd.Parameters)
{
   sql = sql.Replace(param.ParameterName, param.Value.ToString());
}

答案 1 :(得分:0)

你应该看一下Matt Warren撰写的IQueryable Toolkit及其相关文章http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx