CRM 2015 Microsoft.Xrm.Sdk:第二次 CreateQuery 调用出现意外结果

CRM 2015 Microsoft.Xrm.Sdk: Unexpected results in second CreateQuery call

Microsoft.Xrm.Sdk,版本=7.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35

var ctx = new ServiceContext(...);

var result1 = (from f in ctx.CreateQuery<aEntity>()
               where f.field1 == "x"
               select new { f.Id, f.field2 }).ToList();

var result2 = (from f in ctx.CreateQuery<aEntity>()
               where f.field1 == "x"
               select f.field1).First();

结果2 returns无效!在第一个查询result2returns"x"的select子句中加入f.field1后。看起来在第二次调用的上下文中创建并使用了一个内部列集。查看两个调用的 SQL 服务器跟踪,我们看到预期的 select-from 基于 C# 代码的查询。返回的第二个结果不是预期的。有人可以解释这种行为吗?

请记住,LINQ CRM 驱动程序实现只是 SQL 的一个子集。

你能试试这样的吗?

var result1 = (from f in ctx.CreateQuery<aEntity>()
           where f.field1 == "x"
           select new CustomClass { 
               Id = f.aEntityId,
               Field2 = f.field2 
           }).ToList();

如果你愿意,你可以有复杂的查询,但你需要知道什么可以做,什么不能做。

Id 属性 并不总是由驱动程序返回,而是实体的主键,通常是实体逻辑名+ "Id".

对我来说,它看起来像是一种缓存功能,而且它位于 CRM 的一侧,因为正如您提到的 SQL 查询是正确的。当尝试对同一实体记录进行两次连续查询但选择了两个不同的字段时,我的应用程序遇到了同样的问题,第二个请求总是返回 NULL
以下是我在使用 ServiceContext 时使用的解决方法:

  1. 简单的一个:始终检索具有所有字段的实体(没有 select 语句)(即使我想要与否)
  2. 或创建禁用缓存的服务上下文


现在我尝试尽可能少地使用 ServiceContextQueryBase 表达式替换它(即使我喜欢使用 LINQ)。