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
相关产品推荐
相关产品推荐

