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

时间:2016-03-02 15:42:41

标签: microsoft-dynamics dynamics-crm-2015

Microsoft.Xrm.Sdk,Version = 7.0.0.0,Culture = neutral,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();

result2返回null!将f.field1添加到第一个查询中的select子句后,result2返回&#34; x&#34;。看起来像是在第二次调用的上下文中创建并使用内部列集。查看两个调用的SQL Server跟踪,我们可以看到基于C#代码的预期select-from查询。返回的第二个结果不是预期的。有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:1)

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

时使用的解决方法
  1. 简单的一个:总是检索一个包含所有字段的实体(没有select语句)(即使我是否需要)
  2. 或创建具有禁用缓存的服务上下文

  3. 现在我尽量少用ServiceContext代替QueryBase表达式(即使我喜欢使用LINQ)。

答案 1 :(得分:0)

请记住,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”。