CRM 2011 - Onderscheppen van snel zoeken, XML ophalen en query-expressie retourneren niet dezelfde dingen?

Ik maak zoeksnelkoppelingen vanuit het snelzoekvak voor bepaalde entiteiten. Dit is om meerdere retouren te voorkomen, vooral wanneer een naam een ​​plaatsnaam zou kunnen bevatten. (Stad zoekopdrachten zijn relevant, dus het moet blijven)

Ik bereik dit via een plug-in. Dus een gebruiker komt binnen

/name Todd Richardson

In het zoekvak op de weergave van de contactentiteit.

Bijwerken

Dit onderschept ( pre-operation stage: 20 prevalidation stage: 10) de Retrievemultiple request for a contact.

Update beëindigen

Bijwerken As requested here is the beginning of the implementation as generated and then modified from the MSCRM 2011 sdk tools Please remember that this code is in a prototypical state, and may niet be suitable for production code:

protected void ExecutePreAccountRetrieveMultiple(LocalPluginContext localContext)
    {
        if (localContext == null)
        {
            throw new ArgumentNullException("localContext");
        }

        if (localContext.PluginExecutionContext.InputParameters.Contains("Query"))
        {
            if (localContext.PluginExecutionContext.InputParameters["Query"] is QueryExpression)
            {
                //query expression from input is assigned to a local variable for modification.
                QueryExpression qe = (QueryExpression)localContext.PluginExecutionContext.InputParameters["Query"];

                if (qe.Criteria != null)
                {
                    if (qe.Criteria.Filters.Count > 1)
                    {
                        string entitySubject = qe.EntityName;
                        string searchSubject = qe.Criteria.Filters[1].Conditions[0].Values[0].ToString();


                         string namePattern = @"^([/\\-])+N(AME)?:?[\s]*(.+$)";

 //.... Eliminated for brevity, only including branch thats relevant to this question.


if (Regex.IsMatch(searchSubject.TrimEnd("%".ToCharArray()), namePattern, RegexOptions.IgnoreCase))
                            {
                                var Match = Regex.Match(searchSubject.TrimEnd("%".ToCharArray()), namePattern, RegexOptions.IgnoreCase);


                                if (Match.Groups.Count > 1)
                                {
                                    int lastIndex = Match.Groups.Count - 1;
                                    string name = Match.Groups.Cast().Last().Value;
                                    Func> genXpress = (n) =>
                                    {

                                        List ce = new List();

                                        foreach (var val in name.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(x => string.Format("%{0}%", x)))
                                        {
                                            ce.Add(new ConditionExpression
                                            {
                                                Operator = ConditionOperator.Like,
                                                AttributeName = n,
                                                Values = { val }
                                            });
                                        }
                                        return ce;
                                    };

                                    if (entitySubject == "contact")
                                    {

                                        string[] names = name.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                                        if (names.Length > 1)
                                        {
                                            string fn = names[names.Length - 2];
                                            string ln = names[names.Length - 1];

                                            string fetchRequest =
@"<?xml version=""1.0""?>
 
      
      
     
         
             
                 
                     
                     
                  
                 
                     
                     
                
             
         
     
" //

                                            .Replace("%lastname%", ln).Replace("%firstname%", fn);


                                            var conversionRequest = new FetchXmlToQueryExpressionRequest
                                            {
                                                FetchXml = fetchRequest
                                            };
                                            var response = (FetchXmlToQueryExpressionResponse)localContext.OrganizationService.Execute(conversionRequest);

                                            localContext.PluginExecutionContext.OutputParameters["Query"] = response.Query;
                                            return;
                                        }
                                        //variable modified and now passed out for execution.
                                        localContext.PluginExecutionContext.OutputParameters["Query"] = qe;


                                        return;
                                    }
                                }
                            }  //Remainder of code eliminated for different logic branches.

Update beëindigen

Een query-expressie wordt gegenereerd en in de uitvoerparameter met de naam query geplaatst.

Oorspronkelijk was ik de QueryExpression aan het bouwen. Ik merkte dat dit niet werkte. Het maakt niet uit hoe ik mijn query-expressie heb gebouwd

condition1 || condition 2 || condition3 || condition4 

Dus nam ik een andere invalshoek. Ik ging naar de geavanceerde zoekopdracht en maakte een query die precies terugkwam wat ik wilde in de resultaten. Ik heb de fetch-xml gedownload en nu is dit wat ik heb (zoals te zien in de vorige code):

string fetchRequest =
@"<?xml version=""1.0""?>
 
      
      
     
         
             
                 
                     
                     
                  
                 
                     
                     
                
             
         
     
" //

Of het nu gaat om het genereren van de Query-expressie in code, of het ophalen van de service van de organisatie, het lijkt me hetzelfde resultaat te krijgen. In plaats van

(condition1 && condition2) || (condition3 && condition4) 

aan de criteria voldoet, komt het uiteindelijk terecht

condition1 || condition2 || condition3 || condition4 

Ik heb andere varianten op de fetch-XML geprobeerd, waaronder:

string fetchRequest =  @"<?xml version=""1.0""?>
 
      
      
     
         
                 
                 
         
     
"

Nogmaals, dit wordt uiteindelijk

condition1 || condition2

niet

condition1 && condition2

Iedereen heeft enig idee wat er aan de hand is. Is er een andere fetchxml die ik zou moeten gebruiken? Is dit een bug? Het antwoord heeft me voor een beter deel van de dag ellendig gemaakt.

Hopelijk is het gewoon iets gemakkelijks dat ik over het hoofd zie.

3
Zou je het deel van de plug-in willen laten zien, waar je de vraag onderschept en aanpast?
toegevoegd de auteur ccellar, de bron

2 antwoord

U voegt de gewijzigde query toe aan de collectie OutputParameters. Dit is niet correct; de CRM-eventpijplijn verwacht niet dat Query-parameters in deze verzameling zijn en negeert deze daarom. Dit is waarom u de gewenste resultatenset niet ziet.

U moet de bestaande Query-parameter in de InputParameters-verzameling vervangen door de parameter die u hebt gewijzigd.

3
toegevoegd
Als ik wat tijd heb, zal ik deze hypothese testen. Ik heb echter geen hoge verwachtingen van deze. Het lijkt erop dat als u de parameters niet in de uitvoerverzameling opneemt, deze de query niet zo veranderen.
toegevoegd de auteur Todd Richardson, de bron
Ik ga door en accepteer dit antwoord. Ik heb dit eindelijk onderzocht op een dynamische blog hier: blogs.msdn.com/b/ukcrm/archive/2011/03/10/… en ontdekte dat het inderdaad de bedoeling is dat u de eigenschap" Zoekopdracht "van de invoerparameters aanpast . Ik kan dit niet testen omdat ik niet meer deelneem aan dit optreden, maar het is goed om deze vraag definitief te sluiten. Ik zal dit opnieuw bezoeken als ik ooit een exemplaar van CRM krijg om dit te testen.
toegevoegd de auteur Todd Richardson, de bron

In your code you are trying to update OutputParameters at Pre stage plug in. According to documentation it could have no effect and could be overwritten during platform core operation stage. IPluginExecutionContext.OutputParameters Property

2
toegevoegd
Bedankt voor het antwoord. Ik zal dit onderzoeken en uitchecken. +1 voor een reactie na zo een lange tijd!
toegevoegd de auteur Todd Richardson, de bron
Ik denk niet dat dit het probleem is dat ik ervaar. Ik verander constant de parmeters van de vraaguitdrukking, en zij worden niet overschreven. Voorbeeld: ik heb een query die, wanneer deze is toegevoegd met een bepaald voorvoegsel, een veld ophaalt op basis van een getal dat is ingevoerd na het voorvoegsel. Het werkt elke keer. Iets aan deze specifieke vraag wordt gewoon niet goed verwerkt. Ik ben bang dat we deze functie nu zullen opheffen, maar op een bepaald moment in de toekomst zal ik terugkomen.
toegevoegd de auteur Todd Richardson, de bron