You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 15:06:03