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

Dynamics 365中如何在FetchXML查询里返回未设置属性的空值?

解决Dynamics 365 FetchXML查询返回空值属性的问题

这个问题我之前也碰到过,Dynamics 365默认的FetchXML行为确实有点磨人——未设置的属性不会出现在返回结果里,要是不想逐个检查或硬编码属性,有两个实用方案可以解决:

方案1:修改FetchXML,强制返回空值

直接在FetchXML里用coalesce函数处理目标属性,把属性值和null合并,这样哪怕属性没设置,也会在结果里保留这个属性(值为null)。

举个例子,原查询里的属性定义是:

<attribute name="fullname" />

改成下面这样就行:

<attribute value="coalesce(fullname, null)" alias="fullname" />

这种方法不需要改C#代码,直接在查询层面搞定,效率也更高。不过要注意,这个语法要求你的Dataverse/Dynamics 365环境版本足够新(现在大部分主流环境都支持FetchXML的表达式函数了)。

方案2:用C#代码自动补全缺失属性

如果没法修改FetchXML(比如查询是动态生成的),可以先解析原FetchXML里的所有属性,再给返回的每个实体补全缺失的属性。

示例代码如下:

// 先解析FetchXML,提取所有要查询的属性名
var fetchDoc = XDocument.Parse(body.ToString());
var attributeNames = fetchDoc.Descendants("attribute")
    .Select(a => a.Attribute("name")?.Value)
    .Where(name => !string.IsNullOrEmpty(name))
    .ToList();

// 执行查询获取结果
EntityCollection collection = svc.RetrieveMultiple(new FetchExpression(body.ToString()));

// 遍历每个实体,补全缺失的属性
foreach (var entity in collection.Entities)
{
    foreach (var attrName in attributeNames)
    {
        if (!entity.Attributes.ContainsKey(attrName))
        {
            entity.Attributes.Add(attrName, null);
        }
    }
}

这个方法的好处是不用动原查询,完全靠代码适配,而且是从原FetchXML里自动提取属性名,不用硬编码,不管是啥属性都能处理。要是查询里包含关联实体的属性,你只需要调整下解析逻辑,把link-entity里的属性(格式是[关联别名].[属性名])也提取出来就行。


内容的提问来源于stack exchange,提问作者DaemonBee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:37:51