Как использовать фильтр на объекте ссылки? - PullRequest
0 голосов
/ 03 мая 2018

Я использую crm 2016 и пытаюсь получить записи о продукте (пользовательском объекте) в соответствии с фильтрацией связности, мне нужно получить все продукты, которые имеют Active productstatus и связанный телефонный звонок категории fun и not open:

PRODUCT - (productstatus = Active) & (connectedphonecallcategory = fun && связанный телефонный звонок! = открыть)

Когда я запускаю свой текущий запрос, я получаю результаты без фильтра связанных сущностей. Я не понимаю почему.

Это мой код:

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();

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Я просто хочу поделиться этим читаемым форматом вашего ожидаемого запроса. Также, как упоминалось в 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")
                }
            }
        }
    }
};
0 голосов
/ 26 июля 2018

Попробуйте вместо этого использовать запрос FetchXml. С помощью этого метода вы делаете свой фильтр, используя Расширенный поиск. Затем в окне вы загружаете FetchXml. Намного легче отлаживать.

https://msdn.microsoft.com/en-us/library/gg328332.aspx

0 голосов
/ 04 мая 2018

Я думаю, что ваша проблема здесь 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);
...