订单中的动态CRM产品和捆绑包

时间:2018-12-11 07:38:24

标签: c# dynamics-crm

我正在实验Dynamic CRM示例页面上的示例CalculatePrice。 而且,我很难理解如何以良好的方式获得产品和捆绑商品。

我想尝试做的是从具有productstructure属性和producttypecode的订单中获取产品。但是,无论我怎么尝试,我都会收到错误消息。字典中没有给定的键。

以下查询应根据productID从salesorder中查找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 :(得分:0)

对于初学者来说,_productid_value表示法是WebAPI访问查询字段的方式。要使用SDK的后期绑定范例访问productid,请使用:

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();                
    }
}

请注意,局部变量resultsproductsbundles是匿名类型。您可以遍历并访问每个对象的属性,但是也很有可能要将它们强制转换为真实类的实例。