共用方式為


範例:一般虛擬表格資料提供者外掛程式

示範

此範例顯示 Dropbox 檔案共用服務的一般 Microsoft Dataverse 虛擬資料表資料提供者外掛程式 DropboxRetrieveMultiplePlugin 的最小實作。 它使用「裸機」方式,透過建立自訂訪客類別 DropBoxExpressionVisitor 來轉譯 QueryExpression。 它會傳回符合搜尋準則的檔案集合,作為 EntityCollection

備註

此範例需要使用 ILMERGE 將外掛程式與 Dropbox 組件合併後,才能將組件註冊到 Dataverse。 官方不支援使用 ILMERGE。 此範例的未來更新將移除使用 ILMERGE 的需求。

入門指南

若要建置此範例,您必須先在解決方案中安裝 Dropbox.ApiMicrosoft.CrmSdk.Data NuGet 套件。 您還需要一個 DropBox 帳戶,並在建立 Dropbox Client 執行個體時傳遞真實存取權杖。

將下列 using 陳述式新增至您的程式碼:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Dropbox.Api;
using Dropbox.Api.Files;

範例程式碼


public class DropBoxExpressionVisitor : QueryExpressionVisitorBase
{
    public string SearchKeyWords { get; private set; }

    public override QueryExpression Visit(QueryExpression query)
    {
        // Very simple visitor that extracts search keywords
        var filter = query.Criteria;
        if (filter.Conditions.Count > 0)
        {
            foreach (ConditionExpression condition in filter.Conditions)
            {
                if (condition.Operator == ConditionOperator.Like && condition.Values.Count > 0)
                {
                    string exprVal = (string)condition.Values[0];

                    if (exprVal.Length > 2)
                    {
                        this.SearchKeyWords += " " + exprVal.Substring(1, exprVal.Length - 2);
                    }
                }
            }
            return query;
        }
    }
}

public class DropboxRetrieveMultiplePlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        var qe = (QueryExpression)context.InputParameters["Query"];
        if (qe != null)
        {
            var visitor = new DropBoxExpressionVisitor();
            qe.Accept(visitor);
            using (var dbx = new DropboxClient(AccessToken))
            {
                if (visitor.SearchKeyWords != string.Empty)
                {
                    var searchCriteria = new SearchArg(string.Empty, visitor.SearchKeyWords);
                    var task = Task.Run(() => this.SearchFile(dbx, searchCriteria));
                    context.OutputParameters["BusinessEntityCollection"] = task.Result;
                }
            }
        }
    }

    public async Task<EntityCollection> SearchFile(DropboxClient dbx, SearchArg arg)
    {
        EntityCollection ec = new EntityCollection();
        var list = await dbx.Files.SearchAsync(arg);
        foreach (var item in list.Matches)
        {
            if (item.Metadata.IsFile)
            {
                Entity e = new Entity("new_dropbox");
                e.Attributes.Add("new_dropboxid", Guid.NewGuid());
                e.Attributes.Add("new_filename", item.Metadata.AsFile.Name);
                e.Attributes.Add("new_filesize", item.Metadata.AsFile.Size);
                e.Attributes.Add("new_modifiedon", item.Metadata.AsFile.ServerModified);
                ec.Entities.Add(e);
            }
        }
        return ec;
    }
}

另請參閱

開始使用虛擬表格
虛擬資料表的 API 考量
自訂虛擬資料表資料提供者