从C#中检索复杂的SQL查询

本文关键字:SQL 查询 复杂 检索 | 更新日期: 2023-09-27 18:27:50

我有一个复杂的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')))

谢谢你的回复。

从C#中检索复杂的SQL查询

如果您使用的是内部部署系统,我会使用Filtered Views并直接针对它们创建SQL查询。这是迄今为止性能最好的选项,并得到充分支持。

如果这不是一个选项,因为你正在使用CRM Online,那么FetchXML将为你提供最佳性能。

我将在几个问题上与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'