C# 为什么Dynamics CRM 2015 SDK RetrieveEntityRequest在AttributeMetadata中未返回IsLogical?

C# 为什么Dynamics CRM 2015 SDK RetrieveEntityRequest在AttributeMetadata中未返回IsLogical?,c#,dynamics-crm,dynamics-crm-2013,C#,Dynamics Crm,Dynamics Crm 2013,给出以下简单的CRM SDK代码: using (var os = new OrganizationService(CrmConnection.Parse(".... some crm connection ..... ")) { var reReq = new RetrieveEntityRequest(); reReq.EntityFilters = EntityFilters.All; reReq.RetrieveAsIfPublished = true;

给出以下简单的CRM SDK代码:

using (var os = new OrganizationService(CrmConnection.Parse(".... some crm connection ..... "))
{
    var reReq = new RetrieveEntityRequest();
    reReq.EntityFilters = EntityFilters.All;
    reReq.RetrieveAsIfPublished = true;
    reReq.LogicalName = "opportunity";

    var reRes = os.Execute<RetrieveEntityResponse>(reReq);

    // null in my case?
    Console.WriteLine("AccountId: IsLogical = {0}", reRes.EntityMetadata.Attributes[0].IsLogical.Value) 

}
使用(var os=new OrganizationService(CrmConnection.Parse(“…一些crm连接…”))
{
var reReq=新的RetrieveEntityRequest();
reReq.EntityFilters=EntityFilters.All;
reReq.RetrieveAsIfPublished=true;
reReq.LogicalName=“机会”;
var reRes=os.Execute(reReq);
//我的情况是空的?
Console.WriteLine(“AccountId:IsLogical={0}”,reRes.EntityMetadata.Attributes[0].IsLogical.Value)
}
为什么AccountId属性(实际上所有属性)的IsLogical不包含值(例如始终为空)

我在这里的理解应该是AccountId,因为这是一个逻辑属性

更多信息我正在使用NUGET的2015 SDK库,我正在连接到2013年的CRM实例。这可能是不兼容的原因吗?我是否使用了正确的库


非常感谢!

听起来这不适用于系统中的大多数属性。请参阅。以下是摘录:

逻辑属性包含以不同格式存储的值 数据库表而不是实体中的其他属性。在大多数情况下 此内部实现与使用Microsoft无关 动态客户关系管理


这听起来似乎不适用于系统中的大多数属性。请参阅。以下是摘录:

逻辑属性包含以不同格式存储的值 数据库表而不是实体中的其他属性。在大多数情况下 此内部实现与使用Microsoft无关 动态客户关系管理


看起来SDK中的IsLogical是在2015年引入的,我使用的是2013,所以它是空的


它们在2011/13年仍被视为逻辑属性,但它们不会在SDK中重新出现。

看起来SDK中的IsLogical是在2015年引入的,我使用的是2013,因此它的值为Null


它们在2011/13年仍被视为逻辑属性,但在SDK中不会返回。

SDK中记录的
IsLogical
属性用于确定计算字段的排序能力

根据(来自BlueSam答案的链接):

使用逻辑属性作为计算字段的源时 无法对计算字段中的值进行排序

如果目标是2013实例,则该值将为空。2013没有计算字段,因此不需要使用
IsLogical
属性

如果您以2015年实例为目标,并查看
accountid
IsLogical
属性,则该值将为真,因为
opportunity
实体上的
accountid
是对
账户
实体的外键引用

计算字段的规则是,如果计算字段使用
IsLogical==true
的任何字段,则计算字段不能用于排序

这并不意味着该字段在UI上不可编辑,尽管许多逻辑字段在UI上确实不可编辑,但这不是SDK的规则

我修改了您的代码以显示实体上所有字段的IsLogical:

var reReq = new RetrieveEntityRequest();
reReq.EntityFilters = EntityFilters.All;
reReq.RetrieveAsIfPublished = true;
reReq.LogicalName = "opportunity";

var reRes = (RetrieveEntityResponse)conn.Execute(reReq);

foreach (var att in reRes.EntityMetadata.Attributes.OrderBy (a => a.LogicalName))
{
    Console.WriteLine("{0} IsLogical={1}",att.LogicalName, att.IsLogical.Value);
}

SDK中记录的
IsLogical
属性用于确定计算字段的排序能力

根据(来自BlueSam答案的链接):

使用逻辑属性作为计算字段的源时 无法对计算字段中的值进行排序

如果目标是2013实例,则该值将为空。2013没有计算字段,因此不需要使用
IsLogical
属性

如果您以2015年实例为目标,并查看
accountid
IsLogical
属性,则该值将为真,因为
opportunity
实体上的
accountid
是对
账户
实体的外键引用

计算字段的规则是,如果计算字段使用
IsLogical==true
的任何字段,则计算字段不能用于排序

这并不意味着该字段在UI上不可编辑,尽管许多逻辑字段在UI上确实不可编辑,但这不是SDK的规则

我修改了您的代码以显示实体上所有字段的IsLogical:

var reReq = new RetrieveEntityRequest();
reReq.EntityFilters = EntityFilters.All;
reReq.RetrieveAsIfPublished = true;
reReq.LogicalName = "opportunity";

var reRes = (RetrieveEntityResponse)conn.Execute(reReq);

foreach (var att in reRes.EntityMetadata.Attributes.OrderBy (a => a.LogicalName))
{
    Console.WriteLine("{0} IsLogical={1}",att.LogicalName, att.IsLogical.Value);
}

如果要筛选属性以排除不应编辑的属性,还应查看IsValidForUpdate属性。这将告诉您该属性是否可编辑


还有一些属性的AttributeType(或AttributeTypeName.Value)为“Virtual”-这些属性从未使用过,因此您可以忽略它们。

如果要筛选属性以排除不应编辑的属性,您还应该查看IsValidForUpdate属性。这将告诉您该属性是否可编辑


还有带有AttributeType(或AttributeTypeName.Value)的属性of“Virtual”-这些属性从未使用过,因此您可以忽略它们。

如果直接查询属性表,则AccountID的逻辑为true。从我的分析来看,它似乎使用此属性在元数据显示的任何位置对其进行筛选,例如实体属性、字段列表等。例如,您无法在opportunity ent上看到AccountID属性ity解决方案UI。因此,似乎应该为一些有趣的属性(包括提到的accountId)设置该属性。我的理解是,如果有任何从外部实体/选项集(例如查找名称、选项开始名称)拉入的数据,则该属性是合逻辑的如果直接查询属性表,则AccountID的IsLogic为true。根据我的分析,它似乎使用此属性在元数据显示的任何位置对其进行过滤,例如实体属性、字段列表等。例如,您可以