【问题标题】:CRM Plugin - Missing Attributes in Linq resultCRM 插件 - Linq 结果中缺少属性
【发布时间】:2014-05-12 07:59:31
【问题描述】:

我在使用 MSCRM 2011 插件时遇到了一些奇怪的行为。
下面的代码是在产品实体的创建和更新操作上注册的插件的一部分。 每个产品都有几个与之相关的任务(定义为活动实体),因此我想要产品的未完成任务。

var tasks = from t
            in orgContext.CreateQuery("fvm_producttask") 
            where (t.GetAttributeValue<int>("statuscode") != 2 && t.GetAttributeValue<int>("statuscode") != 3)
            where t.GetAttributeValue<EntityReference>("fvm_regardingproduct").Id == product.Id
            select t;

String xx = "";
foreach (String x in tasks.First().Attributes.Keys) {
    xx += x + "\r\n";
}

throw new InvalidPluginExecutionException(xx);  

当我将上面的代码作为 CRM 插件执行时,我的结果中只有 2 个键(主题、activityid),当我删除第二个 where 子句时,我会从 producttask 实体中获得所有键的所需结果。

有人知道这种行为的原因吗? 我知道我可以通过过滤掉其他产品的所有任务来解决这个问题,但这只是一个(肮脏的)解决方法。我想知道为什么上面的代码不起作用。

您可以在下面查看我要检索的记录。

OwnerId                         FA7AF161-D666-E111-8537-001E4F1285B0 
OwningUser                      FA7AF161-D666-E111-8537-001E4F1285B0
OwningTeam                      NULL
OwningBusinessUnit              168D9521-434E-E111-99C9-001E4F1285B0
ActualEnd                       NULL
VersionNumber                   0x00000000002D40BD
ActivityId                      655E63A1-84B9-E311-A79F-005056A56527
IsBilled                        0
CreatedBy                       FA7AF161-D666-E111-8537-001E4F1285B0
Description                     Product Dimensions Required
ModifiedOn                      2014-04-01 14:07:11.000
ServiceId                       NULL
ActivityTypeCode                10134
StateCode                       0
ScheduledEnd                    2014-04-04 10:01:45.000
ScheduledDurationMinutes        4320        
ActualDurationMinutes           NULL
StatusCode                      1
ActualStart                     NULL
CreatedOn                       2014-04-01 10:01:45.000
PriorityCode                    1
RegardingObjectId               NULL
Subject                         Product Requires Attention
IsWorkflowCreated               0
ScheduledStart                  2014-04-01 10:01:45.000
ModifiedBy                      FA7AF161-D666-E111-8537-001E4F1285B0
TimeZoneRuleVersionNumber       0
UTCConversionTimeZoneCode       NULL
InstanceTypeCode                0
SeriesId                        NULL
IsRegularActivity               1
ModifiedOnBehalfBy              FA7AF161-D666-E111-8537-001E4F1285B0
CreatedOnBehalfBy               NULL
TransactionCurrencyId           NULL
ExchangeRate                    NULL
LeftVoiceMail                   0
IsMapiPrivate                   0
RegardingObjectTypeCode         NULL
RegardingObjectIdName           NULL 
ImportSequenceNumber            NULL
OverriddenCreatedOn             NULL
fvm_RegardingProduct            207592F0-E9B8-E311-A79F-005056A56527
fvm_Category                    1 

【问题讨论】:

  • 您能否包含与您的 fvm_regardingproduct 相关的示例任务中的数据?当值为空时,我已经看到属性集合中根本不存在 Key 的情况。一般来说,出于这个原因,我更喜欢使用强类型、生成的代理类型而不是属性集合。
  • 您有任何现场级别的安全措施吗?
  • @Daryl 不,我没有。
  • 我做了一些调试,发现执行插件的产品的每个任务只返回2个属性,其他产品的任务似乎返回所有属性。插件是否有可能在执行期间锁定了某些字段,这就是为什么我没有获得所有属性?
  • @Vosje 在插件运行之前任务是否存在?我会打开 CRM 跟踪并验证生成的 SQL 语句看起来应该是这样。

标签: asp.net linq-to-entities dynamics-crm-2011


【解决方案1】:

可能是您引用的实体具有锁定的字段。

您是否在程序流程的早期进行过任何操作?

也许在 CreateQuery.. 之前尝试 Dispose() 上下文(或者,如果相关,将前面的上下文初始化包装在 using 块中)

HTH 鲍勃

【讨论】:

  • 谢谢,这解决了问题。我在插件中全局声明了 OrganizationServiceContext,并在执行插件时对其进行了一次初始化。通过在每个使用它的函数中本地声明它,问题就消失了。
  • 谢谢,这也解决了我的问题。我重新实例化了 ServiceContext 对象。
  • 非常感谢!我没有任何锁定的字段。这个问题一直是我的克星,你的 Dispose() 技巧效果很好。我的问题是 - 为什么会发生这种情况?你是怎么想出这个解决方案的?在哪里可以了解有关内部工作原理的更多信息 Using 块是包装所有 LINQ 查询的最佳实践吗?
  • @Eccountable 非常欢迎你,使用块只是在 finally 子句中调用 Dispose() 的 try finally 块周围的语法糖,所以做任何你喜欢的事情 :)
【解决方案2】:

使用 CRM SDK 时,它只会返回具有相应值的属性。我猜你的第一个任务除了 Subject 和 ActivityId 之外的所有值都为 null。

【讨论】:

  • 我确实在数据库中查找了具有指定 ID 的 Activity 并找到了我想要的值,所以它们不为空。他只是似乎在检索它们时遇到了问题。
猜你喜欢
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2020-09-26
  • 2019-12-19
  • 2019-11-05
  • 2019-02-14
  • 2020-02-12
  • 2020-11-12
相关资源
最近更新 更多