Как использовать фильтр на объекте ссылки?
Я использую crm 2016 и пытаюсь получить записи о продукте (пользовательском объекте) в соответствии с фильтрацией связности, мне нужно получить все продукты, имеющие Active productstatus, и категория связанных телефонных звонков fun
а также not open
:
PRODUCT - (productstatus = Active) & (relatedphonecallcategory = fun && connectedphonecallstatus!= Open)
Когда я запускаю свой текущий запрос, результаты, которые я получаю, не имеют фильтра связанных сущностей. Я не понимаю почему.
Это мой код:
FilterExpression filter1 = new FilterExpression(LogicalOperator.And);
filter1.Conditions.Add(new ConditionExpression("phonecallcategory", ConditionOperator.Equal, "fun"));
filter1.Conditions.Add(new ConditionExpression("statecode", ConditionOperator.NotEqual, 0));
LinkEntity phoneCallLink = new LinkEntity("product", "phonecall", "productid", "regardingobjectid", JoinOperator.LeftOuter);
phoneCallLink.LinkCriteria = filter1;
phoneCallLink.EntityAlias = "products";
QueryExpression query = new QueryExpression("product");
query.ColumnSet = new ColumnSet("productname");
query.LinkEntities.Add(phoneCallLink);
query.Criteria.AddCondition(new ConditionExpression("productstatus", ConditionOperator.Equal, 0));
EntityCollection AllProductsWithSpecificCallsNotOpen = new EntityCollection();
5 ответов
Я просто хочу поделиться этим читаемым форматом вашего ожидаемого запроса. Также, как упоминалось в jasonscript, используйте Adv Find или FetchXML Builder в xrmtoolbox для построения запроса fetchxml, вы можете просматривать там выражения SQL и выражения запроса.
QueryExpression query = new QueryExpression("product")
{
ColumnSet = new ColumnSet("productname"),
Criteria = new FilterExpression(LogicalOperator.And)
{
Conditions =
{
new ConditionExpression("productstatus", ConditionOperator.Equal, 0)
}
},
LinkEntities =
{
new LinkEntity("product", "phonecall", "productid", "regardingobjectid", JoinOperator.LeftOuter)
{
Columns = new ColumnSet("phonecallcategory"),
LinkCriteria = new FilterExpression(LogicalOperator.And)
{
Conditions =
{
new ConditionExpression("statecode", ConditionOperator.NotEqual, 0),
new ConditionExpression("phonecallcategory", ConditionOperator.Equal, "fun")
}
}
}
}
};
Попробуйте вместо этого использовать запрос FetchXml. С помощью этого метода вы делаете свой фильтр, используя Расширенный поиск. Затем в окне вы загружаете FetchXml. Это гораздо проще для отладки.
Я думаю, что ваша проблема здесь QueryExpression query = new QueryExpression("product");
Ваш вопрос говорит, что ваш Product
пользовательский объект, но вы использовали имя схемы системного объекта Product
который не позволяет деятельности.
Вы должны использовать логическое (все строчные) имя вашей сущности
Вы также можете сгенерировать этот код, используя XrmToolbox. Вот пример запроса, который я создал с помощью этого инструмента. Пожалуйста, обратите внимание:
- Я использовал
Contact
вместоProduct
- Я удалил тип соединения, поэтому он возвращается к внутреннему соединению
Код:
// Initialise
var QEcontact = new QueryExpression("contact");
// Add columns to QEcontact.ColumnSet
QEcontact.ColumnSet.AddColumns("firstname");
// Add link-entity QEcontact_phonecall
var QEcontact_phonecall = QEcontact.AddLink("phonecall", "contactid", "regardingobjectid");
// Define filter QEcontact_phonecall.LinkCriteria
QEcontact_phonecall.LinkCriteria.AddCondition("category", ConditionOperator.Equal, "fun");
QEcontact_phonecall.LinkCriteria.AddCondition("statuscode", ConditionOperator.NotEqual, 1);
Можете ли вы посмотреть здесь, я реструктурировал ваш запрос, чтобы облегчить понимание
Пример: QueryExpression с LinkEntity
//Link
LinkEntity phoneCallLink = new LinkEntity();
phoneCallLink.LinkFromEntityName = "new_product";
phoneCallLink.LinkToEntityName = "phonecall";
phoneCallLink.LinkFromAttributeName = "new_productid";
phoneCallLink.LinkToAttributeName = "regardingobjectid";
phoneCallLink.JoinOperator = JoinOperator.LeftOuter;
phoneCallLink.EntityAlias = "phone";
phoneCallLink.LinkCriteria.Conditions.Add(new ConditionExpression("statecode", ConditionOperator.NotEqual, 0));
phoneCallLink.LinkCriteria.Conditions.Add(new ConditionExpression("phonecallcategory", ConditionOperator.Equal, "fun"));
//Query
QueryExpression query = new QueryExpression("new_product");
query.ColumnSet = new ColumnSet("new_name");
query.LinkEntities.Add(phoneCallLink);
query.Criteria.AddCondition(new ConditionExpression("statecode", ConditionOperator.Equal, 0));
//Execute
var AllProductsWithSpecificCallsNotOpen = service.RetrieveMultiple(query);
Если это все еще не работает, вы можете создать и экспортировать
fetchXml
запрос и преобразовать его в выражение запроса как:
Пример: преобразование FetchXml в QueryExprssion
string fetchXml =
@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='account'>
<attribute name='name' />
<attribute name='accountid' />
<order attribute='createdon' descending='true' />
<order attribute='modifiedon' descending='true' />
<filter type='and'>
<condition attribute='createdon' operator='this-month' />
</filter>
</entity>
</fetch>";
// Convert the FetchXML into a query expression.
var conversionRequest = new FetchXmlToQueryExpressionRequest();
conversionRequest.FetchXml = fetchXml; //fetchXml string
var conversionResponse =(FetchXmlToQueryExpressionResponse)service.Execute(conversionRequest);
var result = conversionResponse.Results.FirstOrDefault();
Измените строку:
LinkEntity phoneCallLink = new LinkEntity("product", "phonecall", "productid", "regardingobjectid", JoinOperator.LeftOuter);
К:
LinkEntity phoneCallLink = new LinkEntity("product", "phonecall", "productid", "regardingobjectid", JoinOperator.Inner);