【问题标题】:Linq to Salesforce "SQL" providerLinq to Salesforce“SQL”提供程序
【发布时间】:2010-11-06 17:54:58
【问题描述】:

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

Salesforce WSDL API 的核心是一组将查询命令作为字符串的“query()”Web 方法。查询的语法是 SQL 风格,但不完全是(他们称之为 SOQL)。我不喜欢“魔术字符串”,所以我想在代码库中使用 Linq,并将 IQueryable 解析为我在服务包装器中需要的 SOQL 查询。这当然是可能的(L2E,L2Sql),但我想知道是否有捷径,因为如果我说自己推出需要一两天以上的时间,我会“鼓励”找到另一种方法(很可能是每个通用查询的方法,这是旧应用程序中使用的方法)。如果我成功地制作了一个通用的 SOQL 解析器,我们可以在其他几个即将推出的应用程序中使用它,我将成为英雄。即使我做了一个只支持某些查询结构的简单的,它也会让我以 Linq-y 的方式继续当前的项目,并且我可以在空闲时间对其进行扩展。

以下是我看到的选项:

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

你们怎么看?对于一个人来说,构建一个 Linq 解析器不仅仅是两天的任务吗?一个涉及现有 Linq 提供商的复杂解决方案可能会做到吗?将表达式字符串切分并以这种方式构造我的查询会很糟糕吗?

编辑:感谢柯克的接地。我对即使是基本的 SOQL 解析器也需要做的事情进行了更多研究,这超出了我按照任何可行的时间表编写工作应用程序代码的范围。例如,我必须从 Select() 方法 lambda 或从我的 WSDL 对象的所有已知列中构建一个默认列表,这是我从未想过的任务(我更关注 Where 解析) .我敢肯定还有许多其他“未知的未知数”可以把这变成一件大事。我发现了几个链接,这些链接显示了编写 Linq 提供程序的基础知识,尽管它们都试图让它变得简单,但现在在时间上是不可行的。现在,我将使用封装命名查询的命名方法来构建我的存储库(一个可格式化的查询字符串的常量类应该减少维护中的麻烦)。不完美,但更可行。如果 Linq2SOQL 提供程序启动,无论是内部还是开源,我们都可以重构。

对于寻找 Linq 提供程序参考的其他人,以下是我找到的有用链接:

【问题讨论】:

    标签: c# linq expression-trees salesforce soql


    【解决方案1】:

    让我们一次拿一个:

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

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

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

    从长远来看,如果您真的认真对待这件事,这绝对是您要走的路。

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

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

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

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


    确实,您应该考虑构建一个查询提供程序并正确执行此操作。我认为两天时间对于让某些东西即使在原始意义上也能发挥作用有点牵强,尽管这可能是可能的。 IMO,您应该在家中研究一下并玩弄它,以便您熟悉基本的零件和零件。那么你可能在两天后几乎无法获得一些可用的查询。

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

    如果工作量太大,您可以考虑选项 3。我不是 SOQL 方面的专家,所以不知道将普通 SQL 查询转换为 SOQL 查询会涉及哪些工作。如果您认为它的算法相当可靠,那可能就是要走的路。

    【讨论】:

    • “插入式”是指与 DA 层的实现不紧密耦合的 Linq 提供程序;尽管 Linq2SQL 和 Linq2Entities 确实创建了 SQL,但它们被设计为放置在它们从模式生成的数据访问对象层之上。我不确定我是否可以轻松地将它们设置为针对 WDSL 生成的对象,但如果可以的话,我已经完成了 80%。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多