2012-03-07 4 views
2

Я считаю, что ответ на этот вопрос может быть использовать Linq для Sql, но хотел, чтобы увидеть, если это то, что можно с помощью QueryExpressions: -CRM 2011: ограничение выражения запроса?

создать выражение запроса, который запрашивает против Entity А, он также ссылки к объекту B (через LinkEntity) и налагает дополнительные критерии. Можно получить столбцы из Entity B, добавив соответствующие имена атрибутов. Тем не менее, он будет получать только связанный объект (внутреннее соединение).

Возможно ли использовать QueryExpression для получения всех связанных записей (и обязательных столбцов) из объекта B, связанного с объектом A (например, все случаи, связанные с контактом, когда контакт передает указанные критерии). Обычно я рассматривал бы инвертирование запроса и поиск Entity B, относящегося к Entity A, с соответствующими условиями LinkEntity, но есть ряд связанных объектов, которые я хотел бы получить для одного и того же запроса контакта.

Так я остался с некоторыми вариантами: -

(1) Выполнить второй запрос (не идеален при переборе по большому количеству результатов от первоначального запроса), (2) Выполните запрос с использованием Linq to CRM на отфильтрованные виды, (3) Совсем другой метод?

Любые мысли будут оценены.

EDIT:

Я закончил с использованием Linq-to-Sql для выполнения этой задачи и код, используемый аналогично тому, что ниже (хотя и с несколько более присоединяется к фактическому запросу!): -

var dataCollection = (from eA in xrmServiceContext.EntityASet 

join eB in xrmServiceContext.EntityBSet on new EntityReference(EntityA.EntityLogicalName, eA.Id) equals (EntityReference)eB.EntityBLookupToEntityA 
select new 
{ 
    Id = eA.Id, 
    EntityBInterestingAttribute = eB.InterestingAttributeName 
} 

так что это вернет строку за Entity А на предприятия В. Чтобы сделать вещи проще, чем я определил пользовательский класс «MyEntityAClass», который имел свойства, которые были списки, чтобы я мог вернуться в один объект для заполнения GridView и т. д. Это больше связано с обработкой этих результатов, хотя я не размещал этот код здесь.

Надеюсь, это имеет смысл. По сути, он получает несколько строк на запись a la SQL, что делает этот метод работы.

+0

Я уверен, что его только меня, но я не понимаю, что запрос, который вы пытаетесь сделать? Можете ли вы сделать запрос в SQL? Левые внешние соединения поддерживаются QueryExpression, так что это может быть то, что вам нужно? – BenPatterson1

+0

Привет, Бен, спасибо за ваш комментарий. Я могу выполнить запрос в SQL, используя внутренние соединения, и я получаю ожидаемое количество строк, например. выбор из набора Entity A и объединение с Entity B атрибута поиска.Но с выражением запроса, если я попытаюсь извлечь столбцы из Entity BI, я могу только получить столбцы из одной из N совпадающих записей в Entity B. Таким образом, проблема не связана с привязкой, но возможность получить требуемые атрибуты из связанных записей, если существует более одного из них (один и тот же псевдоним объекта и имя атрибута). –

+0

Если это еще не ясно (я могу понять, если это не так :)) Я отправлю сценарий кода, когда я вернусь на другую машину позже. –

ответ

-1

QueryExpression может возвращать только поля из одного типа сущности, указанного в QueryExpression.EntityName.

Вы можете использовать FetchXML, который позволяет также получать поля любых объектов связи, которые будут для вас вариантом 3, но, к сожалению, он возвращает данные как XML, которые вам нужно будет проанализировать самостоятельно.

Возможно, быстрее запустить FetchXML, но для записи и тестирования потребуется много времени, и это не самая простая вещь для поддержания.

Пример кода, это получает первый 101 всех случаев, которые являются активными для всех учетных записей, которые являются активными

string fetch = "<fetch count='101' mapping='logical'><entity name='account'><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter><link-entity name='incident' from='customerid' to='accountid'><all-attributes/><filter type='and'><condition attribute='statecode' operator='eq' value='1'/></filter></link-entity></entity></fetch>"; 

string data = yourCrmServiceObject.Fetch(fetch); 
+0

* «QueryExpression может возвращать только поля из одного типа сущности, указанного в QueryExpression.EntityName». * Это явно неправильно. Вы можете иметь LinkEntity и его атрибуты в QueryExpression так же, как и в FetchXml. – Filburt