我有一个复杂的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')))
感谢您的回复。
答案 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'