c#插件的CRM2013 -不接收产品名称+数量在fetch xml查询

本文关键字:fetch 查询 xml 产品名 CRM2013 插件 | 更新日期: 2023-09-27 18:11:05

我正试图从我的实体订单中的网格检索数据。我使用预先查找和选择实体订单产品来获取用户在网格

中选择的产品名称和数量

我的代码如下

'Guid orderID = (Guid)((Entity)context.InputParameters["Target"]).Id;
            string fetchxml = @"
            <fetch distinct='false' mapping='logical' output-format='xml-platform' version='1.0'>
                <entity name='salesorderdetail'>
                    <attribute name='productid'/>
                    <attribute name='productdescription'/>
                    <attribute name='priceperunit'/>
                    <attribute name='quantity'/>
                    <attribute name='extendedamount'/>
                    <attribute name='salesorderdetailid'/>
                    <order descending='false' attribute='productid'/>
                        <link-entity name='salesorder' alias='au' to='salesorderid' from='salesorderid'>
                        <link-entity name='salesorder' alias='ab' to='salesorderid' from='salesorderid'> 
                            <filter type='and'> 
                                <condition attribute='salesorderid' operator='eq' value='" + orderID + @"'/> 
                            </filter> 
                        </link-entity> 
                        </link-entity>
                </entity>
            </fetch>";
            EntityCollection result = service.RetrieveMultiple(new FetchExpression(fetchxml)); foreach (var c in result.Entities)
                {
                    if (result != null && result.Entities.Count > 0)
                    {
                        List<string> _product = new List<string>();
                        foreach (Entity _entity in result.Entities)
                        {
                            _product.Add(_entity.Attributes["name"].ToString());
                            _product.Add(_entity.Attributes["quantity"].ToString());
                        }
                        CSVFile = string.Join(",", _product.ToArray());
                        string AddressPath = "FM-OR" + "_";
                        string AddressSavePath = @"''fm'CRMdata'maesteg'" + AddressPath + ".csv";
                        System.IO.File.WriteAllText(AddressSavePath, CSVFile.ToString());
                    }
                }'

代码将输出结果的CSV文件,但我一直得到错误'键不存在于字典'

我认为问题与以下内容有关

'      _product.Add(_entity.Attributes["name"].ToString());
       _product.Add(_entity.Attributes["quantity"].ToString());
'

我已经检查以确保我在实体orderproduct

中输入的名称是正确的

我不确定这是XMLQuery问题还是其他问题

我已经做了另一个类似的帖子,所以请不要标记下来,我已经做了一个新的,因为它现在解释了整个问题,而不仅仅是询问XML查询

谢谢,肖恩

更新;

       _product.Add(_entity.Attributes["name"].ToString());
       _product.Add(_entity.Attributes["quantity"].ToString());

现在已更改为

       _product.Add(_entity.Attributes["productid"].ToString());
       _product.Add(_entity.Attributes["quantity"].ToString());

这已阻止出现错误消息但不是在CSV文件夹中而是在那里显示

"Microsoft.Xrm.Sdk.EntityReference"

问题可能是由于productid是一个查找

       _product.Add(_entity.Attributes["productid"].ToString());
       _product.Add(_entity.Attributes["quantity"].ToString());

现在如下;

       _product.Add(_entity.Attributes["productid"].ToString());
       var actualName = ((Microsoft.Xrm.Sdk.EntityReference)_entity.Attributes["productid"]).Name;
       _product.Add(_entity.Attributes["quantity"].ToString());

当我抛出invalidpluginexecutionexception (actualName)时,将显示产品的名称但是当CSV文件输出时它仍然显示

"Microsoft.Xrm.Sdk.EntityReference"

新守则及建议修订;

string fetchxml = @"
            <fetch distinct='false' mapping='logical' output-format='xml-platform' version='1.0'>
                <entity name='salesorderdetail'>
                    <attribute name='productid'/>
                    <attribute name='productdescription'/>
                    <attribute name='priceperunit'/>
                    <attribute name='quantity'/>
                    <attribute name='extendedamount'/>
                    <attribute name='salesorderdetailid'/>
                    <order descending='false' attribute='productid'/>
                        <link-entity name='product' alias='ac' to='productid' from='productid'>
                            <attribute name ='name'/>
                        </link-entity>
                        <link-entity name='salesorderdetail' alias='aa' to='productid' from='productid'> 
                        <link-entity name='salesorder' alias='ab' to='salesorderid' from='salesorderid'> 
                            <filter type='and'> 
                                <condition attribute='salesorderid' operator='eq' value='" + orderID + @"'/> 
                            </filter> 
                        </link-entity> 
                        </link-entity>
                </entity>
            </fetch>";
            EntityCollection result = service.RetrieveMultiple(new FetchExpression(fetchxml)); foreach (var c in result.Entities)
                {
                    if (result != null && result.Entities.Count > 0)
                    {
                        List<string> _product = new List<string>();
                        foreach (Entity _entity in result.Entities)
                        {
                           _product.Add(_entity.Attributes["name"].ToString());
                           _product.Add(_entity.Attributes["quantity"].ToString());                          
                        }
                        CSVFile = string.Join(",", _product);
                        string AddressPath = "FM-OR" + "_";
                        string AddressSavePath = @"''fm'CRMdata'maesteg'" + AddressPath + ".csv";
                        System.IO.File.WriteAllText(AddressSavePath, CSVFile.ToString());
                    }
                }

出现给定键在字典中不存在的错误消息

更新-问题解决

问题其实出在

这一行
_product.Add(_entity.Attributes["name"].ToString());

解决方案如下:

 _product.Add(((EntityReference)c.Attributes["productid"]).Name.ToString());

c#插件的CRM2013 -不接收产品名称+数量在fetch xml查询

只有在无法获取product的情况下才需要productid

您可以使用类似的方式检索产品名称:-

var productRecord = service.Retrieve("product", ((Microsoft.Xrm.Sdk.EntityReference)_entity.Attributes["productid"]).Id, new ColumnSet(new[] {"name"}));

然而,如果你可以得到产品,那么以下应该是合适的:-

<fetch distinct="false" mapping="logical" output-format="xml-platform" version="1.0">
    <entity name="salesorderdetail">
        <attribute name="productid"/>
        <attribute name="productdescription"/>
        <attribute name="priceperunit"/>
        <attribute name="quantity"/>
        <attribute name="extendedamount"/>
        <attribute name="salesorderdetailid"/>
        <order descending="false" attribute="productid"/>
        <link-entity name="product" alias="ab" to="productid" from="productid">
            <attribute name="name"/>
        </link-entity>
    </entity>
</fetch>

((Microsoft.Xrm.Sdk.EntityReference) _entity.Attributes [" productid "]) . name;调用返回该对象的名称(即Microsoft.Xrm.Sdk.EntityReference),它不知道您正在查找产品的名称(这是它自己的属性)