Dynamics QueryExpression - 查找 fieldA 等于 fieldB 的实体记录

Dynamics QueryExpression - Find entity records where fieldA equals fieldB

我正在尝试更改 Dynamics CRM 中的一些数据。 为此,我想编写一个插件来搜索具有特殊条件的实体。

到目前为止,没有那么特别。

我可以执行 QueryExpression 并搜索 "field A" 个实体 A 具有 "that value"(例如,字符串)

现在不同的是,我想测试 "field A" 等于 "field B"。

在 T-SQL 中会是 select * 其中 table1.fielda = table1.fieldb

所以我想将一个实体记录的属性值与同一实体记录的属性值匹配。

我搜索并找到了一种可以在 QueryExpression 中的表上进行联接的方法(可以在此处找到 API 参考资料:https://msdn.microsoft.com/en-us/library/dn481591.aspx),但我无法找出如何将它用于我的 porpuse,如果它符合我的要求或者它是否是错误的方式。

那么,有人这样做了吗?

感谢

----更新----

到目前为止我尝试了什么: 基于@Brendon Colburn 提供的 post 我尝试构建自己的连接 LINQ 查询。

不幸的是,构建查询对我试图实现的目标有限制:

您不能在要将一个字段与另一个字段进行比较的地方构建查询。

示例代码来自: CRM 2011: An unhandled exception of type 'System.InvalidOperationException' occurred. referenced from scope '', but it is not defined

(from cl in context.CreateQuery<ContractDetail>()
join a in context.CreateQuery<Account>()
on cl.CustomerId.Id equals a.AccountId
where cl.StateCode.Value == 0
where cl.new_SupportedBy == a.Name
select cl).ToList();

抛出错误 'System.InvalidOperationException' 类型的未处理异常发生在 ConsoleApplication1.exe

更多信息可以在线程中找到 CRM 2011: An unhandled exception of type 'System.InvalidOperationException' occurred. referenced from scope '', but it is not defined

所以,最后似乎无法以好看的方式存档。

看来我最终将搜索我想查看的所有实体记录,并根据我在 for - each 循环中确定的条件查找记录。 :(((

老实说,我只是觉得你做错了什么。您从 Stack Overflow 的其他地方提供的示例不是自连接。也许你想做的也不是。如果您要提供不起作用的查询,那将是有见地的。你所说的限制对我来说听起来不准确。

我相信您描述的是自连接?我认为如果您使用此 LINQ 查询完成同样的事情可能会更容易:

using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
 {
  var query_join5 = from a in svcContext.AccountSet
                    join a2 in svcContext.AccountSet
                    on a.ParentAccountId.Id equals a2.AccountId

                    select new
                    {
                     account_name = a.Name,
                     account_city = a.Address1_City
                    };
  foreach (var c in query_join5)
  {
   System.Console.WriteLine(c.account_name + "  " + c.account_city);
  }
 }

当然是替换字段和实体名称。在此处查看这些操作的 msdn:https://msdn.microsoft.com/en-us/library/gg334593.aspx

在 Dynamics CRM 中,Linq 查询建立在 QueryExpression 之上,因此继承了它的局限性。在 QueryExpression 中,过滤是使用 ConditionExpression 对象完成的。一个 ConditionExpression 总是有两个或三个参数:

  1. 属性名称(左侧)
  2. 一个操作员
  3. (可选)一个或多个文字值

属性名称无法识别值。

因此,当您无法通过联接获得所需的结果时,唯一的选择是查询比实际需要更多的记录,然后再过滤它们。

在以完全信任(仅限本地)模式执行的插件中,实际上可以直接访问 CRM 数据库并执行 SQL 查询,但这有点 hack。