Simple.OData.Client очень медленно - PullRequest
0 голосов
/ 26 июня 2018

Я использую Simple.OData.Client для запроса и обновления в нашей системе динамического управления crm. Но каждый запрос, вставка или обновление занимает до 10 секунд. Это работает как шарм на почтальоне. Это означает, что проблема не в сервере.

Вот мой код:

Базовый класс

 public abstract class CrmBaseDao<T> where T : class
{
    protected ODataClient GetClient()
    {
        return new ODataClient(new ODataClientSettings(BuildServiceUrl())
        {
            Credentials = new NetworkCredential(Settings.Default.CrmUsername, Settings.Default.CrmPassword),
            IgnoreUnmappedProperties = true
        });
    }

    public async Task<IEnumerable<T>> GetAll()
    {
        var client = GetClient();
        return await client.For<T>().FindEntriesAsync();
    }

    private string BuildServiceUrl()
    {
        return Settings.Default.CrmBaseUrl + "/api/data/v8.2/";
    }
}

Производный класс:

    public void Insert(Account entity)
    {
        var task = GetClient()
            .For<Account>()
            .Set(ConvertToAnonymousType(entity))
            .InsertEntryAsync();

        task.Wait();

        entity.accountid = task.Result.accountid;
    }

    public void Update(Account entity)
    {
        var task = GetClient()
             .For<Account>()
             .Key(entity.accountid)
             .Set(ConvertToAnonymousType(entity))
             .UpdateEntryAsync();

        task.Wait();
    }

    private object ConvertToAnonymousType(Account entity)
    {
        return new
        {
            entity.address1_city,
            entity.address1_fax,
            entity.address1_line1,
            entity.address1_postalcode,
            entity.address1_stateorprovince,
            entity.he_accountnumber,
            entity.name,
            entity.telephone1,
            entity.telephone2
        };
    }

    public async Task<Account> GetByHeAccountNumber(string accountNumber)
    {
        return await GetClient().For<Account>()
            .Filter(x => x.he_accountnumber == accountNumber)
            .FindEntryAsync();
    }

Звонок:

 private void InsertIDocsToCrm()
    {
        foreach (var file in GetAllXmlFiles(Settings.Default.IDocPath))
        {
            var sapAccountEntity = GetSapAccountEntity(file);
            var crmAccountEntity = AccountConverter.Convert(sapAccountEntity);

            var existingAccount = crmAccountDao.GetByHeAccountNumber(crmAccountEntity.he_accountnumber);
            existingAccount.Wait();

            if (existingAccount.Result != null)
            {
                crmAccountEntity.accountid = existingAccount.Result.accountid;
                crmAccountDao.Update(crmAccountEntity);
            }
            else
                crmAccountDao.Insert(crmAccountEntity);
        }
    }

Вся эта функция занимает очень много времени (30 секунд +) Есть ли шанс ускорить это?

Кроме того, это занимает много памяти?!

Спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Я подозреваю, что это может быть связано с размером схемы. Я буду следить за тем, что вы открыли на GitHub.

UPDATE. Я запустил несколько тестов для проверки ответов сервера, и обработка внутри Simple.OData.Client заняла всего миллисекунды. Я предлагаю вам запустить тесты на стороне сервера. Вы также можете попробовать назначить ссылки на файлы метаданных для свойства MetadataDocument объекта ODataClientSettings.

...