I am having trouble loading a Dynamic Component Presentation from the Broker based on a fairly simple query like the below, where I am trying to load the Component based on being tagged with a specific Keyword:
    private string GetComponentPresentations()
    {
        Logger.Log.Info("Entered GetComponentPresentations");
        var publicationCriteria = new PublicationCriteria(_publicationId);
        int schemaId = int.Parse(SchemaId.Split('-')[1]);
        // Is it the correct content type (Schema)
        var isSpecifedSchema = new ItemSchemaCriteria(schemaId);
        // Type of the item is 16 (Component).
        var isComponent = new ItemTypeCriteria(16);
        // All of the above conditions must be true
        Criteria isCorrectComponent = CriteriaFactory.And(isSpecifedSchema, isComponent);
        var publicationAndIsComponent = CriteriaFactory.And(publicationCriteria, isCorrectComponent);
        //Only get components tagged with the specified keyword
        var keywordCriteria = new KeywordCriteria(_productsCategoryTcmId, ProductFilter, Criteria.Equal);
        //Only get Components of the correct type from the correct publication
        Criteria fullCriteria = CriteriaFactory.And(publicationAndIsComponent, keywordCriteria);
        using (var query = new Query(fullCriteria))
        {
            string[] results = query.ExecuteQuery();
            using (var cpf = new ComponentPresentationFactory(_publicationId))
            {
                if(results != null)
                {
                    var resultString = new StringBuilder();
                    foreach (string componentTcmId in results)
                    {
                        Logger.Log.Info("Looping over results");
                        int componentId = int.Parse(componentTcmId.Split('-')[1]);
                        int templateId = int.Parse(TemplateId.Split('-')[1]);
                        ComponentPresentation cp = cpf.GetComponentPresentation(componentId, templateId);
                        if (cp != null && !string.IsNullOrEmpty(cp.Content))
                        {
                            resultString.Append(cp.Content);
                            Logger.Log.InfoFormat("Appended Content {0}",cp.Content);
                        }
                    }
                    Logger.Log.Info("Returning");
                    return resultString.ToString();
                }
                Logger.Log.Info("Results was null.");
                return string.Empty;
            }
        }
    }
I can see the item in the ITEMS_CATEGORIES_AND_KEYWORDS table in the Broker database with the keyword I expect and I can load the CP manually if I comment out the query and hardcode the TCM ID in.
I have made sure the Category is published and that all the variables' values are correct.
I have ensured the Keyword has a value and a key set to the appropriate value.
What else can I check?
                        
I have managed to get this working using the following code:
No idea why I can get results this way but nothing using the Criteria api?