转向非常简单的表达式<func <t,bool =“”>&gt;进入SQL where子句</func <t,>

时间:2009-04-14 12:24:36

标签: .net sql linq linq-to-sql lambda

我需要查询许多不同的数据源,并且能够将所有查询限制在非常简单的表达式中,且条件不超过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运行。

2 个答案:

答案 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是表的名称。然后你只需要:

  • 之前切断了一切 包括“=&gt;”操作
  • 将所有运算符从lambda更改为SQL语法:'=='变为'='。
  • 改变'&amp;&amp;'到AND和'||'到OR
  • 在字符串操作中相应地更改撇号(“ - &gt;”)。

您可以使用括号对逻辑进行分组。使用LIKE查找字符串中的子字符串。有关where子句的语法,请查看this site

使用字符串替换来做魔术:

str = str.Replace("==", "=");