OrganizationServiceContext.CreateQuery vs Fetch

本文关键字:Fetch vs CreateQuery OrganizationServiceContext | 更新日期: 2023-09-27 18:29:29

希望有人能从性能的角度阐明使用OrganizationServiceContext.CreateQuery与使用FetchXML(或QueryExpression)的区别。

我已经广泛使用了LINQ,但我是CRM的新手。CreateQuery似乎很适合我的技能,但我想知道最终的表现。

我直接意识到

var result = from e in orgContext.CreateQuery("xyz_myentity")
             where e["email"] == "someone@example.com"
             select e;

将返回xyz_myentity的所有属性,但我似乎找不到位于CRM顶部的LINQ提供程序的任何文档。使用匿名类型会限制从SQL/CRM返回的属性吗?还是在从服务器返回完整的数据集之后,"客户端"正在发挥作用?SQL查询是否针对所有属性,然后LINQ提供程序是否在此基础上构建匿名类型?

var result = from e in orgContext.CreateQuery("xyz_myentity")
             where e["email"] == "someone@example.com"
             select new { Name=e["xyz_name"] };

OrganizationServiceContext的引入是否有其他考虑因素?

OrganizationServiceContext.CreateQuery vs Fetch

LINQ for CRM是在QueryExpression之上构建的,因此具有几乎相同的限制。它在Microsoft.Xrm.Sdk库的客户端实现。库向CRM web服务发送QueryExpression请求。

LINQ在查询堆栈中添加了一个抽象层(LINQ->QueryExpression->SQL),因此您可以预期性能会受到较小的影响。

FetchXML是可用于查询CRM的最古老的技术。微软表示,它在服务器上的性能稍差。编写FetchXml查询归结为构造XML消息,因此通常编程经验较差。

OrganizationServiceContext是处理LINQ查询所必需的;它是一个能够跟踪数据对象变化的对象。众所周知,它有一些问题,而且,它也有成本。例如,跟踪大量数据是不可取的。

当我不得不在LINQ和QueryExpression之间做出选择时,我仍然倾向于后者。当你需要查询CRM时,这是最轻量级的技术,在一些扩展方法的帮助下,编程体验是可以的。

(注:CRM 2016添加了一种使用Web API的新查询方法。)