我需要查询许多不同的数据源,并且能够将所有查询限制在非常简单的表达式中,且条件不超过2个。我的lamba表达式的典型复杂性的一个例子是:
b => b.user == "joe" && b.domain == "bloggs.com"
在我的非SQL数据源上我很好,因为我可以将它们转换为对象列表并使用LINQ查询,例如:
public override T Get(List<T> assets, Expression<Func<T, bool>> whereClause)
{
return assets.Where(a => whereClause.Compile()(a)).FirstOrDefault();
}
我的问题是当我需要查询关系数据库时 - 我只关心Postgresql和MySQL - 我一直在苦苦挣扎。我有nHibernate到Linq“工作”,但有一些问题,它停止和停止访问数据库或无法关闭连接,典型的事情期待从beta的东西,所以我不抱怨。
因为我的查询非常简单,我很乐意自己构建SQL,我想知道是否有一种相对无痛的方式将我的Expression转换为SQL where子句?
我已经快速搜索并找到了一些示例,当然已经有一些Linq-to-SQL引擎,所以我知道它可以完成。问题是,我是否可以在一天或更少的努力中鞭打它?这就是我估计它会让我找到一个兼容的Linq-to-SQL库并加载测试它假设它运行正常。我确实有很大的性能考虑因素,因此原始SQL对我来说是优选的,而不是通过ORM运行。
答案 0 :(得分:0)
编写LINQ提供程序可能非常困难。我建议调查这些链接:
Linq Provider for MySql, Postgres, Oracle(这是开源的)
Writing custom LINQ provider
答案 1 :(得分:0)
根据您的注释,您只想从lambda构建一个SQL WHERE子句,让我们看一下WHERE子句。我将在完整的SELECt语句的上下文中使用它,但更新和删除它是相同的。
一个例子
SELECT * FROM b
WHERE b.user == 'joe' AND b.domain == 'bloggs.com'
如您所见,构建where子句非常容易:
我认为b是表的名称。然后你只需要:
您可以使用括号对逻辑进行分组。使用LIKE查找字符串中的子字符串。有关where子句的语法,请查看this site。
使用字符串替换来做魔术:
str = str.Replace("==", "=");