protected override async Task <MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken) { var title = string.Empty; var data = turnContext.Activity.Value; var titleParam = query.Parameters?.FirstOrDefault(p => (p.Name == "Documents" || p.Name == "assetTitle")); if (titleParam != null) { title = titleParam.Value.ToString(); } var assets = await MESearchHandler.Search(query.CommandId, title, this.configuration); if (assets.Count == 0) { return(new MessagingExtensionResponse { ComposeExtension = new MessagingExtensionResult { Type = "message", Text = "No match found.", }, }); } // We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects. // The Preview is optional, if it includes a Tap, that will trigger the OnTeamsMessagingExtensionSelectItemAsync event back on this bot. var attachments = assets.Select(asset => { var previewCard = new ThumbnailCard { Title = asset.Title }; previewCard.Images = new List <CardImage>() { new CardImage(configuration["BaseUri"] + "/Images/MSC17_cloud_006.png") }; CardHelper cardhelper = new CardHelper(); var assetCard = cardhelper.GetAssetCard(asset); var attachment = new MessagingExtensionAttachment { ContentType = AdaptiveCards.AdaptiveCard.ContentType, Content = assetCard.Content, Preview = previewCard.ToAttachment(), }; return(attachment); }).ToList(); return(new MessagingExtensionResponse { ComposeExtension = new MessagingExtensionResult { Type = "result", AttachmentLayout = "list", Attachments = attachments, }, }); // The list of MessagingExtensionAttachments must we wrapped in a MessagingExtensionResult wrapped in a MessagingExtensionResponse. }