Продукты и комплекты Dynamic CRM в заказе - PullRequest
0 голосов
/ 11 декабря 2018

Я экспериментирую с примером CalculatePrice на странице примера Dynamic CRM.И мне трудно понять, как правильно получать продукты и комплекты.

Я хочу попробовать сделать продукты из заказа с атрибутом productstructure и producttypecode.Но кажется, что я пытаюсь получить ошибку. Указанный ключ отсутствует в словаре.

В приведенном ниже запросе следует искать productID от продавца на основе productID

            QueryExpression query = new QueryExpression("salesorderdetail");
            query.ColumnSet.AddColumns("quantity", "salesorderispricelocked", "priceperunit", "producttypecode", "_productid_value");
            query.Criteria.AddCondition("salesorderid", ConditionOperator.Equal, entity.Id);

            QueryExpression query2 = new QueryExpression("product");
            query2.ColumnSet.AddColumns("productstructure", "productnumber" , "productid");
            query.Criteria.AddCondition("productid", ConditionOperator.Equal, ec.Entities["_productid_value"]);

Затем я пытаюсьитерировать список объектов, чтобы увидеть, имеют ли они структуру продукта и его код продукта

            for (int i = 0; i < ec.Entities.Count; i++)
            {
            if (ec.Entities[i].GetAttributeValue<int>("producttypecode") == 6)
            { you are a product 
            if (ec.Entities[i].GetAttributeValue<int>("productstructure") == 3){ you are a bundle

Это ссылка на пример кода, который я использую: https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/sample-calculate-price-plugin

1 Ответ

0 голосов
/ 11 декабря 2018

Для начала нотация _productid_value - это способ доступа WebAPI к полю поиска.Чтобы получить доступ к productid, используя парадигму позднего связывания SDK, используйте:

myEntity["productid"] или

myEntity.GetAttributeValue<Guid>("productid") или

myEntity.GetAttributeValue<EntityReference>("productid").

Помимо этого, поскольку Product является поиском в OrderDetail, используя пару LinkEntity объектов, которые вы можете обойтись одним запросом.

Я бы, вероятно, использовал LINQ и сделал бы что-то подобное:

private void getProducts(Guid salesOrderId)
{
    using (var context = new Microsoft.Xrm.Sdk.Client.OrganizationServiceContext(svc))
    {
        var query = from od in context.CreateQuery("salesorderdetail")
                    join so in context.CreateQuery("salesorder") 
                    on od.GetAttributeValue<Guid>("salesorderid") equals so.GetAttributeValue<Guid>("salesorderid")
                    join p in context.CreateQuery("product")
                    on od.GetAttributeValue<Guid>("productid") equals p.GetAttributeValue<Guid>("productid")
                    where od.GetAttributeValue<Guid>("salesorderid").Equals(salesOrderId)
                    select new
                    {
                        OrderDetailId = od.GetAttributeValue<Guid>("salesorderdetailid"),
                        ProductId = od.GetAttributeValue<EntityReference>("productid"),
                        Quantity = od.GetAttributeValue<decimal?>("quantity"),
                        IsPriceLocked = so.GetAttributeValue<bool?>("ispricelocked"),
                        PricePerUnit = od.GetAttributeValue<Money>("priceperunit"),
                        ProductTypeCode = od.GetAttributeValue<OptionSetValue>("producttypecode"),
                        ProductStructure = p.GetAttributeValue<OptionSetValue>("productstructure"),
                        ProductNumber = p.GetAttributeValue<string>("productnumber")
                    };
        var results = query.ToList();
        var products = results.Where(e => e.ProductStructure.Value == 6).ToList();
        var bundles = results.Where(e => e.ProductStructure.Value == 3).ToList();                
    }
}

Обратите внимание, что локальные переменные results, products и bundles являются анонимным типом.Вы можете просмотреть и получить доступ к свойствам каждого объекта, но есть также большой шанс, что вы захотите привести их к экземплярам реального класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...