【问题标题】:Retrieve Complicated SQL Query from C# [closed]从 C# 检索复杂的 SQL 查询 [关闭]
【发布时间】:2014-10-24 07:16:09
【问题描述】:

我有一个复杂的 SQL 查询。我必须从 C# 中检索它。检索复杂 SQL 查询的最佳方法是什么? (如 QueryByAttribute、FetchXML、QueryExpression 等) 这是我的代码:

SELECT R.Name
FROM   role R 
WHERE  R.roleid IN 
    (SELECT roleid 
     FROM   systemuserroles SR 
     WHERE  SR.systemuserid IN 
         (SELECT S.systemuserid 
          FROM  systemuser S 
          WHERE S.new_departmentid3 = 
              (SELECT new_departmentid3 
               FROM systemuser S 
               WHERE S.systemuserid = '8B8825F9-6B27-E411-8BA9-000C29E0C100')))

感谢您的回复。

【问题讨论】:

  • 我可能遗漏了一些基本的东西,但看起来您的查询过于复杂。这不会返回相同的东西吗:SELECT R.Name FROM role R INNER JOIN systemuserroles SR ON R.roleid = SR.roleid WHERE SR.systemuserid = '8B8825F9-6B27-E411-8BA9-000C29E0C100'
  • 不。它只返回 1 行。原始的返回 6 行。
  • 该查询返回与该 systemuser Guid 具有相同 departmentid3 的 systemusers 的所有角色。

标签: c# sql c#-4.0 dynamics-crm-2011 crm


【解决方案1】:

如果您使用的是本地系统,我会使用过滤视图并直接针对它们创建 SQL 查询。这是迄今为止性能最好的选项,并且完全受支持。

如果因为您使用的是 CRM Online 而无法选择,那么 FetchXML 将为您提供最佳性能。

【讨论】:

    【解决方案2】:

    我将在几个问题上与 Ben 不同意:

    过滤视图包含其中的安全检查,旨在能够为用户运行报告(它们不受技术支持,但在 12 次汇总过程中,我只有一次重大更改,而且确实很小)。非过滤视图几乎相同,只是它们不包含所有额外连接以确保用户有权查询他们尝试查询的信息。因此,在这方面,非过滤视图将为您提供最佳性能,但我建议仅在性能差异很大时才使用它,并且仅用于报告。 (理论上你可以直接进入表格,但微软似乎更有可能通过任何给定的汇总来更改)。

    在线可用的大数据请求的最佳性能不是 Fetch-Xml,而是 Odata,因为 O-Data 的有效负载比 Fetch Xml 小得多。但是,使用 oData 存在一些技术限制(由于连接太多,您将无法在一次调用中执行当前查询,但您可以在两次调用中执行)。

    附:我认为这是一个更容易阅读的等效 SQL 语句:

    SELECT R.Name
    FROM   role R 
    INNER JOIN systemuserroles SR ON R.roleId = SR.roleId
    INNER JOIN SystemUser S ON SR.systemuserid = S.systemuserid
    INNER JOIN systemuser S2 ON S.new_departmentid3 = S2.new_departmentid3
    WHERE  S2.systemuserid = '8B8825F9-6B27-E411-8BA9-000C29E0C100'
    

    【讨论】:

    • 很抱歉,不支持使用未过滤视图而不是使用过滤视图。是的,它们会正常工作,速度更快,我非常怀疑更新会被破坏,但微软并未明确支持。此外,由于 CRM 对 Odata 端点施加的限制,可以复制 OP 的查询。我承认我没有用过很多 OData,但我会认为查询不可能一次完成?
    • @BenWilliams 我是正确的。我们目前将它们用于报告,因为它们比过滤器具有巨大的性能增益:social.technet.microsoft.com/wiki/contents/articles/…
    • @BenWilliams OData 的建议更多的是用于社区教育,而不是用于此特定情况,因为是的,在这种情况下,查询将需要 2 次 Odata 调用,而且很可能,有效载荷无法弥补进行两次调用的时间要求。
    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多