C# 按CRM下拉列表值查询表达式

C# 按CRM下拉列表值查询表达式,c#,drop-down-menu,dynamics-crm-4,C#,Drop Down Menu,Dynamics Crm 4,在MS CRM 4中,我尝试使用c#查询所有帐户,其中一个字段的picklist等于“No”。我知道选择列表包含每个项目的id和值,但我只想查询值 这是我目前的代码: ConditionExpression serviceContractCondition = new ConditionExpression(); serviceContractCondition.AttributeName = "kez_servicecontracttype"; service

在MS CRM 4中,我尝试使用c#查询所有帐户,其中一个字段的picklist等于“No”。我知道选择列表包含每个项目的id和值,但我只想查询值

这是我目前的代码:

ConditionExpression serviceContractCondition = new ConditionExpression();
        serviceContractCondition.AttributeName = "kez_servicecontracttype"; 
        serviceContractCondition.Operator = ConditionOperator.Equal; 
        serviceContractCondition.Values = new string[] { "Everything" };
在上面的代码中,我测试它,看它是否只能找到服务合同类型等于所有内容的帐户(我将conditionOperator更改为equal)。我没有工作,而是得到了这个例外

System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage消息、WebResponse响应、Stream responseStream、Boolean asyncCall)在System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName、Object[]参数)在crm.CrmService.Execute(请求)处在c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\crmcustoms\3e2de0cf\f06ef1a\App\u WebReferences.iwjjnsp-.0.cs:crmcustoms.MetricFunctions.Retrieve\u SC\u Total()中,在e:\Projects\Kezber\crmcustoms\App\u Code\MetricFunctions.cs:第421行


服务器无法处理请求。

选取列表项具有显示标签和内部(数字)值。首先,您需要找到与
No
对应的值。
MetadataService
允许您这样做。首先,实例化该服务:

var metaservice = new MetadataService();.
metaservice.Url = "http://localhost/mscrmservices/2007/metadataservice.asmx";

metadata.Credentials = "same as you use for the crm webservice";
然后,使用此方法检索选取列表标签的值:

int getPicklistValueByName(string picklistName, string entityLogicalName, string logicalName, MetadataService metaService)
{     
   RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest();
   attributeRequest.EntityLogicalName = entityLogicalName;
   attributeRequest.LogicalName = kogicalName;

   var attributeResponse = (RetrieveAttributeResponse)metaService.Execute(attributeRequest);
   var picklist = (PicklistAttributeMetadata)attributeResponse.AttributeMetadata;

   return picklist.Options.Where(op => op.Label.UserLocLabel.Label == picklistName).Single().Value.Value;
}
电话可能是这样的:

var value = getPicklistValueByName("kez_servicecontracttype", "key_entitytype", "No", metaService)

现在,在条件表达式中使用此值。另一种方法是在您的程序中将数值硬编码为常量-这取决于您的场景。

我们没有从crm添加元数据web引用,是否有一种方法可以在不使用metaservice的情况下获取数值,并对其进行硬编码,因为我相信这是以前在我们的crm中所做的。如果我去编辑picklist条目“No”,它表示值为1。编辑picklist条目正是找到数值的方法。因此,是的,您可以将该值硬编码到您的程序中;现在一切都正常了。我的建议是使用常量或枚举来避免代码中的幻数。