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());
只有在无法获取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),它不知道您正在查找产品的名称(这是它自己的属性)