QueryExpression и CRM2011 FetchXml
мы узнали, что Linq для CRM 2011 ужасно сломан - похоже, он вошел без какого-либо QA, выполненного на нем. Индикатор, как сломана поставщик запрос .Где (x => x== "b") работает, но это .Где (x = > " b " = = x) может не зависеть от некоторых предыдущих условий, таких как оператор join. Мне действительно пришлось переписать части поставщика запросов и мне больше повезло с дерьмом,которое я собрал.
однако это не может продолжаться, есть еще другие проблемы, и мне не платят за работу в MS, поэтому я ищу альтернативы. Эти 2 придумали QueryExpression & FetchXml, как описано здесь:http://msdn.microsoft.com/en-us/library/gg334607.aspx
может ли кто-нибудь дать мне честные, реальные плюсы и минусы использования QueryExpression против FetchXml? Я хотел бы знать, как они сравниваются с точки зрения производительности, скорости развития, надежности и гибкости.
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 я должен открыть расширенный поиск, затем добавить столбцы, затем поместить мои критерии и так далее, наконец, я загружаю его и копирую в свой код и так далее.
наконец, FetchXML имеет наименьшие ограничения среди других.
Что касается производительности, которую я пытался сравнить между Linq и FetchXML для того же запроса, используя секундомер, результатом был FetchXML быстрее, чем Linq.
чтобы опираться на отличный ответ Анвара, сосредоточив внимание на LINQ против FetchXml, я добавлю I никогда использовать QueryExpression
. почему?
LINQ: запросы строятся с использованием стандартного языка, но внутренне использует QueryExpression so ограничивается функциями QueryExpression.
QueryExpression: запросы строятся как объектная модель. Поддерживает все функции в FetchXML, за исключением агрегатов и группировка.
так что это хуже в запросе власти, чем FetchXml
без Расширенная генерация кода поиска, и она предлагает ту же функциональность, что и поставщик LINQ, предлагая совершенно нестандартный интерфейс запросов (в отличие от LINQ).
что касается функциональности LINQ (non), ограничения поставщика LINQ четко, и я думаю, довольно хорошо,документирована. Ваш .Where(x => "b" == x)
фрагмент, например, нарушает where
статья ограничение:
здесь: в левой части предложения должно быть имя атрибута, а в правой сторона предложения должна быть значением. Вы не можете установить в левую сторону к постоянный. Обе стороны предложения не могут быть константами.
не защищая Microsoft: они должны поставить в много работы над поставщиком LINQ (читай: поставщик direct-to-SQL) перед поставщиком LINQ является профессиональным, но эй, по крайней мере, у них есть большая оговорка.
меня специально попросил клиент использовать модель выражения запроса, поэтому, чтобы облегчить мою жизнь, я прибегнул к добавлению множества методов расширения в IOrganizationService. Примеры Включают:
public static List<T> GetEntities<T>(
this IOrganizationService service,
params object[] columnNameAndValuePairs
) where T : Entity
который преобразует объект params [] и тип сущности 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, в которые легко попасть.
Я бы выступил за FetchXML, потому что я могу использовать его в коде JavaScript или C#, в отличие от LINQ или QueryExpression...поэтому одной вещью меньше учиться и поддерживать. Что касается таких вещей, как Intellisense, есть отличный инструмент, который подключается к XrmToolbox под названием FetchXML Строитель это намного сложнее в разработке сложных запросов, чем вы когда-либо увидите с помощью Advanced Find. Я использую его в течение месяца для онлайн-клиента CRM, и он так же близок к использованию SQL как вы можете получить в этой среде. Он также может генерировать код QueryExpression для меня. Я передал этот инструмент моим бизнес-аналитикам, и они собираются использовать его в городе, чтобы сделать сложные наборы данных для приборной панели - большая победа для клиентов.
Я сожалею о потере обнаружения ошибок с ранней привязкой, но мне нравится