所以,我有这个非常简单的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生成器?
答案 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。