使用C#从Dynamics CRM读取DataCollection<Entity>返回OptionSetValue问题
问题原因及修正方案
你的代码存在3个核心问题:
- 字段查询配置不匹配:构造
QueryExpression时,你仅在ColumnSet中指定了拉取new_book字段,但循环输出时取的是new_bookid;同时查询条件里用到的new_bookid也没有加入查询列范围,Dynamics CRM默认不会返回未在ColumnSet中声明的字段值,仅会返回对应类型的默认占位符,也就是你看到的类名文本。 - 变量拼写笔误:你定义的查询变量名为
bookQuery,但调用RetrieveMultiple方法时传入的是bookeQuery,多了一个字母e,该问题会直接导致编译报错,如果是贴代码时的手误可忽略。 - OptionSetValue类型输出方式错误:
new_book是选项集类型,对应SDK中的Microsoft.Xrm.Sdk.OptionSetValue类,直接打印该类的实例会输出类名而非实际值,你需要访问它的Value属性拿到选项的数字编码,如果需要获取选项对应的显示文本,可直接读取实体的FormattedValues集合。
修正后的代码示例
QueryExpression bookQuery = new QueryExpression("new_res") { // 把需要用到的所有字段都加入ColumnSet ColumnSet = new ColumnSet("new_book", "new_bookid"), Criteria = { Conditions = { new ConditionExpression() { AttributeName="new_bookid", Operator = ConditionOperator.NotNull } } } }; DataCollection<Entity> bookList = service.RetrieveMultiple(bookQuery).Entities; foreach (var c in bookList) { // 输出选项集的数字值 var optionValue = c.GetAttributeValue<OptionSetValue>("new_book")?.Value; // 输出选项集的显示文本 var optionText = c.FormattedValues.Contains("new_book") ? c.FormattedValues["new_book"] : string.Empty; // 输出bookid var bookId = c.GetAttributeValue<Guid>("new_bookid"); Console.WriteLine($"ID:{bookId}, 选项值:{optionValue}, 选项文本:{optionText}"); }
补充说明
如果需要批量获取所有选项集的键值映射,可提前调用RetrieveAttributeRequest接口拉取new_book字段的元数据,一次性拿到所有选项的编码和显示文本的对应关系,避免逐行读取FormattedValues的性能损耗。
内容的提问来源于stack exchange,提问作者DDS
相关产品推荐
相关产品推荐

