使用Microsoft.PowerPlatform.Dataverse.Client查CRM用户遇MetadataCache错误
问题原因
你错误地把OData查询语法直接传给了QueryExpression的构造函数。QueryExpression是Dataverse客户端SDK的强类型查询对象,它的构造参数只需要实体单数逻辑名(这里是systemuser,Dataverse实体逻辑名是单数,REST接口用复数是OData的约定),而不是带$select的OData URL片段。系统把你传入的systemusers?$select=...当成实体名称去元数据缓存里查找,自然找不到对应实体,所以抛出了错误。
正确代码示例
方式一:用QueryExpression(推荐,强类型更易维护)
using (var client = new ServiceClient(cert, StoreName.My, null, instanceUri, true, null, clientId, null, null)) { if (client.IsReady) { // 传入实体单数逻辑名构造QueryExpression var query = new QueryExpression("systemuser") { // 指定需要返回的字段 ColumnSet = new ColumnSet("systemuserid", "domainname", "internalemailaddress", "fullname") }; var multiple = await client.RetrieveMultipleAsync(query); // 遍历处理查询结果 foreach (var user in multiple.Entities) { var userId = user.GetAttributeValue<Guid>("systemuserid"); var domainName = user.GetAttributeValue<string>("domainname"); var email = user.GetAttributeValue<string>("internalemailaddress"); var fullName = user.GetAttributeValue<string>("fullname"); // 这里写你的业务逻辑 } } }
方式二:用OData查询字符串(REST风格)
如果更习惯OData语法,可以用RetrieveMultipleAsync的重载直接传OData查询路径:
using (var client = new ServiceClient(cert, StoreName.My, null, instanceUri, true, null, clientId, null, null)) { if (client.IsReady) { // 直接传入OData查询字符串 var multiple = await client.RetrieveMultipleAsync("systemusers?$select=systemuserid,domainname,internalemailaddress,fullname"); // 遍历处理结果 foreach (var user in multiple.Entities) { // 同样方式获取属性值 } } }
关键注意点
QueryExpression要用实体单数逻辑名,OData接口用复数,两者要区分开。- 强类型的
QueryExpression更适合复杂查询(过滤、排序、关联查询等),还能避免拼写错误。
内容的提问来源于stack exchange,提问作者Ofer Gal
相关产品推荐
相关产品推荐

