public static string SearchObjectByEnumerationCriteriaXml(ManagementPackEnumeration mpe, ManagementPackClass mpc, ManagementPackProperty mpp)
        {
            ManagementPack mp                  = mpc.GetManagementPack();
            string         strMPName           = MakeSafeXML(mp.Name);
            string         strMPVersion        = MakeSafeXML(mp.Version.ToString());
            string         strMPPublicKeyToken = MakeSafeXML(mp.KeyToken);
            string         strClassName        = MakeSafeXML(mpc.Name);
            string         strPropertyName     = MakeSafeXML(mpp.Name);

            // This is XML that validates against the Microsoft.EnterpriseManagement.Core.Criteria schema.
            string strCriteria = String.Format(@"
                <Criteria xmlns=""http://Microsoft.EnterpriseManagement.Core.Criteria/"">
                  <Reference Id=""{0}"" Version=""{1}"" PublicKeyToken=""{2}"" Alias=""MP"" />
                    <Expression>
                        <SimpleExpression>
                            <ValueExpressionLeft>
                                <Property>$Target/Property[Type='MP!{3}']/{4}$</Property>
                            </ValueExpressionLeft>
                            <Operator>Equal</Operator>
                            <ValueExpressionRight>
                                <Value>{{{5}}}</Value>
                            </ValueExpressionRight>
                        </SimpleExpression>
                    </Expression>
                </Criteria>
                ", strMPName, strMPVersion, strMPPublicKeyToken, strClassName, strPropertyName, mpe.Id.ToString());

            return(strCriteria);
        }
        private void TestGettingARandomNumberOfIncidents()
        {
            EnterpriseManagementGroup    emg               = new EnterpriseManagementGroup(txtServerName.Text);
            ManagementPackClass          mpcIncident       = Helper.GetClassByName("System.WorkItem.Incident", emg);
            ManagementPack               mpIncidentLibrary = mpcIncident.GetManagementPack();
            ManagementPackTypeProjection mptpIncidentFull  = Helper.GetTypeProjectionByName("System.WorkItem.Incident.ProjectionType", emg);
            string strCriteria = Helper.SearchWorkItemByLikeIDCriteriaXml("2", mpIncidentLibrary.Name, mpIncidentLibrary.Version.ToString(), mpIncidentLibrary.KeyToken, mpcIncident.Name);
            IObjectProjectionReader <EnterpriseManagementObject> reader = Helper.GetBufferedObjectProjectionReader(strCriteria, 30, mptpIncidentFull, emg);
            double dIncidentIDSum = 0;

            foreach (EnterpriseManagementObjectProjection emop in reader)
            {
                string strID = emop.Object[mpcIncident, "Id"].Value.ToString();
                dIncidentIDSum += (double)Int32.Parse(strID);
            }
            MessageBox.Show(dIncidentIDSum.ToString());
        }
        private void TestGettingIncidentsByGUIDVsWorkItemID()
        {
            EnterpriseManagementGroup emg               = new EnterpriseManagementGroup(txtServerName.Text);
            ManagementPackClass       mpcIncident       = Helper.GetClassByName("System.WorkItem.Incident", emg);
            ManagementPack            mpIncidentLibrary = mpcIncident.GetManagementPack();
            IObjectReader <EnterpriseManagementObject> readerAllIncidents = emg.EntityObjects.GetObjectReader <EnterpriseManagementObject>(mpcIncident, ObjectQueryOptions.Default);
            ManagementPackTypeProjection mptpIncidentFull = Helper.GetTypeProjectionByName("System.WorkItem.Incident.ProjectionType", emg);
            double dByGUIDElapsedTime       = 0;
            double dByWorkItemIDElapsedTime = 0;
            double dNumberOfTries           = 1000;
            double i = 0;

            do
            {
                i++;
                int intRandomIncident = Helper.GetRandomNumber(0, readerAllIncidents.Count);
                EnterpriseManagementObject emoIncident = readerAllIncidents.ElementAtOrDefault <EnterpriseManagementObject>(intRandomIncident);
                Guid   guidIncidentId = emoIncident.Id;
                string strWorkItemID  = emoIncident[mpcIncident, "Id"].Value.ToString();

                DateTime dtByGUIDStart = DateTime.Now;
                EnterpriseManagementObjectProjection emopIncident = emg.EntityObjects.GetObjectProjectionWithAccessRights <EnterpriseManagementObject>(emoIncident.Id, mptpIncidentFull);
                DateTime dtByGUIDEnd = DateTime.Now;
                TimeSpan tsByGUID    = dtByGUIDEnd - dtByGUIDStart;
                dByGUIDElapsedTime += tsByGUID.Milliseconds;

                DateTime dtByWorkItemIDStart = DateTime.Now;
                string   strCriteria         = Helper.SearchWorkItemByIDCriteriaXml(strWorkItemID, mpIncidentLibrary.Name, mpIncidentLibrary.Version.ToString(), mpIncidentLibrary.KeyToken, mpcIncident.Name);
                IObjectProjectionReader <EnterpriseManagementObject> readerIncident = Helper.GetBufferedObjectProjectionReader(strCriteria, 1, mptpIncidentFull, emg);
                DateTime dtByWorkItemIDEnd = DateTime.Now;
                TimeSpan tsByWorkItemID    = dtByWorkItemIDEnd - dtByWorkItemIDStart;
                dByWorkItemIDElapsedTime += tsByWorkItemID.Milliseconds;
                pbProgress.Value          = (int)(i / dNumberOfTries * 100);
            }while (i < dNumberOfTries);

            MessageBox.Show(string.Format("By GUID: {0}    By Work Item ID: {1}", dByGUIDElapsedTime.ToString(), dByWorkItemIDElapsedTime.ToString()));
        }
        public static void CreateQueue(string strDisplayName, string strName, string strCriteria, ManagementPackClass mpc, ref ManagementPack mp, EnterpriseManagementGroup emg)
        {
            ManagementPack mpClass    = mpc.GetManagementPack();
            string         strMPAlias = MakeMPElementSafeName(mpClass.Name);

            AddManagementPackReference(strMPAlias, mpClass.Name, ref mp, emg);

            ManagementPackClass classWorkItemGroup = GetClassByName("System.WorkItemGroup", emg);
            ManagementPackClass mpcQueue           = new ManagementPackClass(mp, strName, ManagementPackAccessibility.Public);

            mpcQueue.Abstract    = false;
            mpcQueue.Base        = classWorkItemGroup;
            mpcQueue.DisplayName = strDisplayName;
            mpcQueue.Hosted      = false;
            mpcQueue.Extension   = false;
            mpcQueue.Singleton   = true;
            mpcQueue.Status      = ManagementPackElementStatus.PendingAdd;

            ManagementPackRelationship         mprWorkItemGroupContainsWorkItem = GetRelationshipByName("System.WorkItemGroupContainsWorkItems", emg);
            ManagementPackRelationshipEndpoint mpreSource = new ManagementPackRelationshipEndpoint(mpcQueue, "ContainedByGroup");
            ManagementPackRelationshipEndpoint mpreTarget = new ManagementPackRelationshipEndpoint(mpcQueue, "GroupContains");

            mpreSource.Type = mpcQueue;
            mpreTarget.Type = mp.ProcessElementReference <ManagementPackClass>(String.Format("$MPElement[Name=\"{0}!{1}\"]$", strMPAlias, mpc.Name));

            ManagementPackRelationship mprQueueWorkItem = new ManagementPackRelationship(mp, String.Format("{0}.Relationship", strName), ManagementPackAccessibility.Public);

            mprQueueWorkItem.DisplayName = String.Format("{0} Contains {1}", strDisplayName, mpc.DisplayName);
            mprQueueWorkItem.Abstract    = false;
            mprQueueWorkItem.Base        = mprWorkItemGroupContainsWorkItem;
            mprQueueWorkItem.Source      = mpreSource;
            mprQueueWorkItem.Target      = mpreTarget;
            mprQueueWorkItem.Status      = ManagementPackElementStatus.PendingAdd;

            ManagementPackDiscoveryRelationship mpdrQueueWorkItem = new ManagementPackDiscoveryRelationship();

            mpdrQueueWorkItem.TypeID = mprQueueWorkItem;

            ManagementPack mpSystemCenter = GetManagementPackByName("Microsoft.SystemCenter.Library", emg);
            string         strSystemCenterLibraryMPAlias = MakeMPElementSafeName(mpSystemCenter.Name);

            AddManagementPackReference(strSystemCenterLibraryMPAlias, mpSystemCenter.Name, ref mp, emg);

            ManagementPackModuleType mpmtGroupPopulator = emg.Monitoring.GetModuleType("Microsoft.SystemCenter.GroupPopulator", mpSystemCenter);

            ManagementPackDiscovery mpdQueueWorkItem = new ManagementPackDiscovery(mp, MakeMPElementSafeName(String.Format("WorkITemGroup.{0}.Discovery.{1}", mpcQueue.Name, Guid.NewGuid().ToString())));

            ManagementPackDataSourceModule mpdsmPopulator = new ManagementPackDataSourceModule(mpdQueueWorkItem, MakeMPElementSafeName(Guid.NewGuid().ToString()));
            ManagementPackElementReference <ManagementPackDataSourceModuleType> mperGroupPopulator = mp.ProcessElementReference <ManagementPackDataSourceModuleType>(String.Format("$MPElement[Name=\"{0}!{1}\"]$", strSystemCenterLibraryMPAlias, mpmtGroupPopulator.Name));

            mpdsmPopulator.TypeID = mperGroupPopulator;

            StringBuilder sb = new StringBuilder();

            sb.Append("<RuleId>$MPElement$</RuleId>\r\n");
            sb.Append(String.Format("<GroupInstanceId>$MPElement[Name=\"{0}\"]$</GroupInstanceId>\r\n", strName));
            sb.Append("<MembershipRules>\r\n");
            sb.Append("<MembershipRule>\r\n");
            sb.Append(String.Format("<MonitoringClass>$MPElement[Name=\"{0}!{1}\"]$</MonitoringClass>\r\n", strMPAlias, mpc.Name));
            sb.Append(String.Format("<RelationshipClass>$MPElement[Name=\"{0}\"]$</RelationshipClass>\r\n", mprQueueWorkItem.Name));
            sb.Append(strCriteria);
            sb.Append("</MembershipRule>\r\n");
            sb.Append("</MembershipRules>\r\n");

            mpdsmPopulator.Configuration = sb.ToString();

            mpdQueueWorkItem.Enabled         = ManagementPackMonitoringLevel.@true;
            mpdQueueWorkItem.Target          = mpcQueue;
            mpdQueueWorkItem.ConfirmDelivery = false;
            mpdQueueWorkItem.Remotable       = true;
            mpdQueueWorkItem.Priority        = ManagementPackWorkflowPriority.Normal;
            mpdQueueWorkItem.Category        = ManagementPackCategoryType.Discovery;
            mpdQueueWorkItem.DiscoveryRelationshipCollection.Add(mpdrQueueWorkItem);
            mpdQueueWorkItem.DataSource = mpdsmPopulator;

            mp.AcceptChanges();
        }