从C#检索复杂的SQL查询

时间:2014-10-24 07:16:09

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

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

感谢您的回复。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

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

P.S。我认为这是一个更易于阅读的等效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'