QueryExpression и FetchXml CRM2011

Мы обнаружили, что Linq для CRM 2011 ужасно неисправен — кажется, что он вошел в систему без какого-либо контроля качества. Показателем того, насколько сильно сломан провайдер, является запрос типа .Where(x => x== "b"), который работает, но этот .Where(x => "b" == x) может не зависеть от какого-либо предшествующего условия, такого как заявление о присоединении. На самом деле мне пришлось переписать части поставщика запросов, и мне больше повезло с тем дерьмом, которое я собрал.

Однако так продолжаться не может, есть еще другие проблемы, и мне не платят за работу в MS, поэтому я ищу альтернативы. Эти 2 пришли к QueryExpression и FetchXml, как подробно описано здесь: http://msdn.microsoft.com/en-us/library/gg334607.aspx

Может ли кто-нибудь дать мне честные, реальные плюсы и минусы использования QueryExpression по сравнению с FetchXml? Я хотел бы знать, как они сравниваются с точки зрения производительности, скорости разработки, надежности и гибкости.


person Alwyn    schedule 07.02.2012    source источник


Ответы (4)


На мой взгляд, я обычно выбираю 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.

person Anwar    schedule 07.02.2012
comment
Анвар, почему ты сказал, что это волшебное утверждение? Похоже, вам все еще нужно десериализовать результат в объекты, что непросто. Мне нравится идея загрузки fetchxml напрямую из веб-приложения CRM. - person Alwyn; 07.02.2012
comment
Потому что ранее в CRM 2004 мне приходилось загружать возвращенный XML в XMLDocument, затем проверять каждый узел и так далее, что приводило к ужасному коду. - person Anwar; 07.02.2012

В дополнение к отличному ответу Анвара, посвященному LINQ и FetchXml, я добавлю, что никогда не использую QueryExpression. Зачем?

LINQ: запросы строятся с использованием стандартного языка, но внутри используется QueryExpression, поэтому они ограничены функциями QueryExpression.

QueryExpression: запросы создаются как объектная модель. Поддерживает все функции FetchXML, кроме агрегатов и группировки.

Таким образом, он хуже с точки зрения мощности запросов, чем FetchXml без генерации кода расширенного поиска, и предлагает те же функции, что и поставщик LINQ, предлагая при этом совершенно нестандартный интерфейс запросов (в отличие от LINQ).

Что касается (не)функциональности LINQ, ограничения поставщика LINQ очевидны, и я думаю, достаточно хорошо, задокументировано. Ваш фрагмент .Where(x => "b" == x), например, нарушает ограничение пункта where:

где: левая часть предложения должна быть именем атрибута, а правая часть предложения должна быть значением. Вы не можете установить левую часть константой. Обе части предложения не могут быть константами.

Не защищая Microsoft: им нужно проделать много работы над провайдером LINQ (читай: провайдером прямого доступа к SQL), прежде чем провайдер LINQ станет профессиональным, но эй, по крайней мере, у них есть большой отказ от ответственности.

person Peter Majeed    schedule 08.02.2012
comment
Вы упомянули, что QueryExpression поддерживает все функции FetchXML, но не может выполнять вложенные соединения, множественные соединения, внешние соединения и соединения с несколькими условиями. Однако все это возможно с FetchXml. - person Abel; 20.04.2012
comment
@Abel: я поверю тебе на слово, так как я не использую QueryExpression. Я должен добавить, что это слова Microsoft, а не мои (см. ссылку выше), поэтому я не могу исправить их документацию. - person Peter Majeed; 20.04.2012
comment
Ну, точнее, сам класс QueryExpression их поддерживает, но когда вы пытаетесь запустить выражение против CrmService, оно всегда будет давать ошибку SOAPException. В интернете полно жалоб на это. - person Abel; 21.04.2012
comment
@Abel: я вижу - очень плохо! Будем надеяться, что Microsoft предоставит пользователям полный доступ к их собственным данным. - person Peter Majeed; 21.04.2012

Клиент специально попросил меня использовать модель Query Expression, поэтому, чтобы облегчить себе жизнь, я прибегал к добавлению множества методов расширения в 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, в которые легко попасть.

person Daryl    schedule 08.02.2012
comment
@Eccountable, проверьте библиотеку DLaB.Xrm.Common в среде модульного тестирования для получения дополнительных примеров: github.com/daryllabar /XrmUnitTest - person Daryl; 18.10.2015

Я бы выступал за FetchXML, потому что я могу использовать его в своем коде JavaScript или C#, в отличие от LINQ или QueryExpression... поэтому на одну вещь меньше, которую нужно изучать и поддерживать. Что касается таких вещей, как Intellisense, есть отличный инструмент, который подключается к XrmToolbox и называется FetchXML Builder. разработка сложных запросов, чем вы когда-либо увидите с помощью расширенного поиска. Я использую его уже месяц для клиента CRM Online, и он настолько близок к использованию SQL, насколько это возможно в этой среде. Он также может генерировать для меня код QueryExpression. Я передал этот инструмент своим бизнес-аналитикам, и они собираются использовать его для создания сложных наборов данных для информационной панели — большая победа для клиентов.

Я сожалею о потере обнаружения ошибок при раннем связывании, но мне нравится

person Eccountable    schedule 17.10.2015