服务器端Fetchxml返回不同的结果

Rai*_*ine 2 plugins fetchxml dynamics-crm-2011

我们的一个程序允许用户通过选择视图然后点击功能区按钮批量插入相关记录.保存表单,设置标志,然后插件完成其工作.

我们正在使用带有视图选择器的子网格,以便用户动态选择或创建自己的视图.选择视图后,将显示结果数(提供的值为lte 5k).

当插件运行fetchxml服务器端(检索userquery或savedquery,然后是Retrieve + FetchExpression)时,结果会发生变化.我们不仅获得不同数量的记录,而且还有一些记录不同.

我们的结论是,这个问题与时区有关.一些过滤器包括"on-or-after"运算符以及日期值.例:

<filter type="and">
  <condition attribute="modifiedon" operator="on-or-after" value="2011-01-01" />
  <condition attribute="modifiedon" operator="on-or-before" value="2011-12-31" />
</filter>
Run Code Online (Sandbox Code Playgroud)

该插件以管理员身份运行.更改插件用户无效 - 就像使用FetchExpression从CRM中提取记录时不考虑当前用户时区一样.

如何确保fetchxml表达式在客户端和服务器端返回相同的结果?

可能相关:MSDN线程.

谢谢你的时间.

编辑:按照Daryl的建议,我运行了一条SQL跟踪.结果令人费解.对于客户端查询,日期是正确偏移的(从CRM运行,即高级查找) - 这意味着fetchxml使用用户的时区设置正确转换.服务器端的同一查询不会发生这种情况; 输出SQL包含"原样"的日期过滤器,没有时区偏移量.无论查询执行上下文的来源如何,我都假设发生了相同的翻译.

编辑2:隐藏的代码区域(我的上一个调试手段)中的标志阻止插件在运行用户的上下文中实例化服务.一切都运行良好.感谢大家的时间和帮助,非常感谢.

Dar*_*ryl 6

使用日期时,请始终记住转换为utc,因为这就是CRM将它们存储在数据库中的方式.

本机CRM Advanced查找将查看当前用户的时区,并在执行SQL查询之前将他们输入的高级查找转换为UTC.你的插件控件需要做同样的事情.这些是在将条件放入Fetch Xml/Linq表达式/查询表达式之前需要执行的步骤.

  1. 通过他们的SystemUserId获取用户的UserSetting.TimeZoneCode.
  2. 从步骤1查找TimeZoneCode的TimeZoneDefinition.StandardName
  3. 调用TimeZoneInfo.FindSystemTimeZoneById()传递步骤2中的标准名称(您可以将步骤1和2组合成单个查询,但我更喜欢使用步骤1中的输入缓存步骤3的结果,以略微提高性能.即.使用TimeZoneCode作为键的字典和TimeZoneInfo作为值)
  4. 使用此函数获取您将在插件查询中使用的时间的UTC值:

public static DateTime ConvertTimeToUTC(DateTime time, TimeZoneInfo timeZone)
{
    if (time.Kind != DateTimeKind.Unspecified)
    {
        // If the DateTime is created with a specific time zone(ie DateTime.Now), getting the offset will
        // blow chow if it isn't the correct time zone:
        // The UTC Offset of the local dateTime parameter does not match the offset argument.
        //Parameter name: offset

        // This quick check will recreate the serverLocal time as unspecified

        time = new DateTime(
            time.Year,
            time.Month,
            time.Day,
            time.Hour,
            time.Minute,
            time.Second,
            time.Millisecond);

    }
    var offest = new DateTimeOffset(time, timeZone.GetUtcOffset(time));
    return offest.UtcDateTime;
}
Run Code Online (Sandbox Code Playgroud)

  • @raine我想我对运行客户端的意思感到困惑.我假设你正在使用javascript?我建议启用跟踪并确保将获取XML正确地转换为SQL查询,就像您期望的那样.这将有助于缩小哪一方有本地vs utc问题...... (2认同)