6

我们发现 CRM 2011 的 Linq 严重损坏 - 它似乎在没有对其执行任何 QA 的情况下进入。提供程序损坏程度的指标是 .Where(x => x== "b") 之类的查询有效,但此 .Where(x => "b" == x) 可能不取决于某些先前的条件,例如 a加入声明。实际上,我不得不重写查询提供程序的部分内容,并且对我整理的废话感到更加幸运。

然而,这不能继续下去,还有其他问题,而且我没有为 MS 工作的报酬,所以我正在寻找替代方案。这两个出现了 QueryExpression 和 FetchXml,详细如下:http: //msdn.microsoft.com/en-us/library/gg334607.aspx

谁能给我一个诚实的、现实生活中使用 QueryExpression 与 FetchXml 的利弊?我想知道它们在性能、开发速度、健壮性和灵活性方面的比较。

4

4 回答 4

11

为了建立在 Anwar 专注于 LINQ 与 FetchXml 的出色答案的基础上,我将添加我从不使用QueryExpression. 为什么

LINQ:查询是使用标准语言构建的,但内部使用 QueryExpression,因此仅限于 QueryExpression 的功能。

QueryExpression:查询被构建为对象模型。支持 FetchXML 中的所有功能,聚合和分组除外。

因此,它的查询能力比FetchXml 没有高级查找代码生成更差,它提供与 LINQ 提供程序相同的功能,同时提供完全非标准的查询接口(与 LINQ 不同)。

至于 LINQ(非)功能,LINQ 提供程序的局限性很明显,而且我认为相当好,已记录在案.Where(x => "b" == x)例如,您的代码段违反了where条款限制:

where:子句的左侧必须是属性名,子句的右侧必须是值。您不能将左侧设置为常数。子句的两边都不能是常数。

不为微软辩护:在 LINQ 提供程序达到专业级之前,他们需要在 LINQ 提供程序(阅读:直接到 SQL 提供程序)上投入大量工作,但是嘿,至少他们有一个很好的免责声明。

于 2012-02-08T02:30:57.747 回答
10

在我看来,我通常会根据需求选择 Linq 或 FetchXml。

对于 Linq:在早期绑定的情况下,我喜欢使用 Linq,因为它是强类型的,而且它对开发速度有很大帮助,但正如你上面所说,它有它的缺点。

对于 FetchXML:我真的很喜欢使用这个神奇的语句:

EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2));

foreach (var c in result.Entities)
{
   System.Console.WriteLine(c.Attributes["name"]);
}

为什么?因为除了聚合分组之外,它与使用 QueryExpression 非常相似。我讨厌 FetxhXML 的唯一一点是它很难构建,这与 Linq 不同。

为了构建 FetchXML 查询,我必须打开 Advanced-Find 然后添加列然后输入我的条件等等,最后我下载它并将其复制到我的代码中,等等。

最后,FetchXML 在其他中具有最少的限制。

关于我尝试在 Linq 和 FetchXML 之间使用StopWatch对相同查询进行基准测试的性能,结果是 FetchXML 比 Linq 快。

于 2012-02-07T19:29:17.203 回答
6

一个客户特别要求我使用查询表达式模型,所以为了让我的生活更轻松,我求助于向 IOrganizationService 添加了很多扩展方法。示例包括:

public static List<T> GetEntities<T>(
    this IOrganizationService service, 
    params object[] columnNameAndValuePairs
) where T : Entity

它将 params object[] 和 T 实体类型转换为查询表达式,并自动将结果返回到实体列表。所以它是这样使用的:

foreach(var c in service.GetEntities<Contact>("lastname", "Doe", "firstname", "Smith"))
{
    ... 
}

我也经常使用这个:

public static T GetFirstOrDefault<T>(
    this IOrganizationService service,
    params object[] columnNameAndValuePairs
) where T : Entity

var c = service.GetFirstOrDefault<Contact>("owner", id);

这些类型的扩展方法使查询表达式的工作变得更加容易,为您提供了更多的 LINQ 类型样式,没有容易陷入的奇怪的 linq 限制陷阱。

于 2012-02-08T15:13:14.750 回答
2

我主张支持 FetchXML,因为我可以在我的 JavaScript 或 C# 代码中使用它,这与 LINQ 或 QueryExpression 不同……因此需要学习和维护的东西更少。至于诸如 Intellisense 之类的东西,有一个很棒的工具可以插入 XrmToolbox,称为FetchXML Builder,它在设计复杂查询方面比使用 Advanced Find 所看到的要复杂得多。我现在已经为一个 CRM Online 客户端使用它一个月了,它与在这个环境中可以使用的 SQL 一样接近。它还可以为我生成 QueryExpression 代码。我已将此工具交给我的业务分析师,他们将使用它为仪表板制作复杂的数据集——这对客户来说是一个巨大的胜利。

我确实对早期绑定无法检测到错误感到遗憾,但我喜欢

于 2015-10-17T18:24:31.700 回答