Linq到Salesforce"SQL"提供商

Kei*_*thS 6 c# linq salesforce expression-trees soql

所以,我有这个新项目.我公司使用SalesForce.com云存储有关日常运营的信息.我的工作是编写一个新的应用程序,除其他外,它将这个数据的CRUD操作与现有的内部应用程序功能更加无缝地集成.

Salesforce WSDL API的核心是一组"query()"Web方法,它们将查询命令作为字符串.查询的语法是SQL-ish,但不完全(他们称之为SOQL).我不是"魔术字符串"的粉丝,所以我想在代码库中使用Linq,并将IQueryable解析为我在服务包装器中需要的SOQL查询.这当然是可能的(L2E,L2Sql),但我想知道是否有快捷方式,因为如果我说它需要花费一两天才能推出我自己的,我会被"鼓励"找到另一种方法(很可能是每个通用查询的方法,这是旧应用程序中使用的方法).如果我成功创建了一个通用的SOQL解析器,我们可以在其他几个即将推出的应用程序中使用它,我将成为英雄.

以下是我看到的选项:

  • 现在的Linq2SOQL提供商看起来更难了(我的Google-fu在这里让我失望,否则根本就没有;唯一的.NET包装器只提到Linq是一个很好的产品).
  • 构建表达式树解析器.它至少需要支持Select和Where方法调用,并且需要解析lambda或操纵它们的方法体以获得所需的操作和投影.这似乎是一项相当庞大的任务,但就像我说的那样,这当然是可能的.
  • 在Linq2Sql或类似的现有Linq提供程序中包装服务,这将允许我提取足够接近的查询字符串,对其进行修改并将其传递给服务.那里肯定有几十个(虽然没有一个只是插入,AFAIK).
  • 调用Expression.ToString()(或Expression.DebugView),并操纵该字符串以创建SOQL查询.它会变得脆弱,它会变得丑陋(在幕后),它只会支持我明确寻找的东西,但它会提供一个基本的翻译,让我继续前进.

你们有什么感想?为一个人构建一个Linq解析器超过两天的任务?涉及现有Linq提供商的提升解决方案可能会这样做吗?切断表达式字符串并以这种方式构造我的查询会不会很糟糕?

编辑:感谢Kirk的接地.我更多地了解了即使是基本的SOQL解析器我还需要做些什么,而且我的工作应用程序代码在任何可行的时间表上编写都超出了我的范围.例如,我必须从我的WSDL对象的所有已知列中的Select()方法lambda或默认的一个构建一个选择列表,这个任务我甚至都没想过(我更关注Where解析) .我敢肯定还有很多其他"未知的未知数"可能会把这变成一个非常重要的事情.我找到了几个链接,它们显示了编写Linq提供程序的基础知识,尽管它们都试图使它变得简单,但现在只是时间不可行.我现在将构建我的存储库,使用封装命名查询的命名方法(格式化查询字符串的常量类应该减少维护中的头部刮擦量).不完美,但更可行.如果Linq2SOQL提供商在内部或开源时启动,我们可以重构.

对于寻找Linq提供者参考的其他人,以下是我发现的有用链接:

Kir*_*oll 3

让我们一次一个地看它们:

更加努力地寻找现有的 Linq2SOQL 提供程序(我的 Google-fu 在这里让我失望,否则根本就没有提供程序;唯一的 .NET 包装器只提到 Linq 是一个必备品)。

是的,我怀疑已经存在,但希望你能找到一个。

构建表达式树解析器。它至少需要支持 Select 和Where 方法调用,并且需要解析 lambda 或操作它们的方法体以获得所需的操作和投影。这似乎是一项相当艰巨的任务,但正如我所说,这当然是可能的。

如果你真的认真对待这个问题,从长远来看,这绝对是正确的选择。

将服务包装在 Linq2Sql 或类似的现有 Linq 提供程序中,这将允许我提取足够接近的查询字符串,对其进行完善并将其传递给服务。那里肯定有几十个(据我所知,尽管没有一个是直接进来的)。

你说的“进来”是什么意思?您可以轻松地直接从 L2S 获取 SQL。

调用 Expression.ToString() (或 Expression.DebugView),并操作该字符串以创建 SOQL 查询。它会很脆弱,它会很丑陋(在幕后),并且它只会支持我明确寻找的内容,但它将提供一个基本的翻译,让我继续前进。

我强烈建议您不要采用这种方法,因为至少它正确解析表达式树一样困难。如果有的话,为了使用它,您必须首先将解析的字符串放入适当的对象模型中 - 即您开始使用的现有表达式树。


实际上,您应该考虑构建一个查询提供程序并正确执行此操作。我认为两天的时间对于让一些东西在原始意义上发挥作用来说有点漫长,尽管这可能是可能的。IMO,你应该在家里研究一下它并尝试一下,这样你就可以熟悉基本的部件和部件。那么两天后您可能几乎无法获得一些可用的查询。

但老实说,完全实施此类项目实际上需要几周甚至几个月的时间,而不是几天。

如果工作量太大,您可以考虑选项 3。我不是 SOQL 方面的专家,因此不知道将普通 SQL 查询转换为 SOQL 查询会涉及哪些工作。如果您认为它相当算法化且可靠,那么这可能是正确的选择。