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

C# Dynamics QueryExpression-查找fieldA等于fieldB的实体记录,c#,dynamics-crm,microsoft-dynamics,C#,Dynamics Crm,Microsoft Dynamics,我正在尝试更改dynamics crm中的一些数据。 为了实现这一点,我想编写一个插件来搜索具有特定条件的实体 到目前为止,没有那么特别 我可以做一个QueryExpression,并在entits a的“字段a”中搜索“该值”(例如字符串) 现在不同的是,我想测试“字段A”是否等于“字段B” 在T-SQL中应该是 选择*其中table1.fielda=table1.fieldb 所以我想将一个实体记录的属性值与同一实体记录的属性值进行匹配 我在QueryExpression中搜索并找到了一种可

我正在尝试更改dynamics crm中的一些数据。 为了实现这一点,我想编写一个插件来搜索具有特定条件的实体

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

我可以做一个QueryExpression,并在entits a的“字段a”中搜索“该值”(例如字符串)

现在不同的是,我想测试“字段A”是否等于“字段B”

在T-SQL中应该是 选择*其中table1.fielda=table1.fieldb

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

我在QueryExpression中搜索并找到了一种可以在表上进行连接的方法(这里可以找到API引用:),但我无法找到如何在我的porpuse中使用它,以及它是否符合我的要求或是否是错误的方法

那么,有人这么做了吗

Thx

----更新----

到目前为止,我尝试的是: 根据@Brendon Colburn提供的帖子 我试图构建我的自连接LINQ查询

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

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

示例代码来自:

(来自context.CreateQuery()中的cl)
在context.CreateQuery中加入

因此,最终似乎不可能以好看的方式将其归档


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

老实说,我只是觉得你做错了什么。你从堆栈溢出中的其他地方提供的示例不是自连接。也许你试图做的也不是自连接。如果你提供的查询不起作用,那将是有见地的。你所说的限制对我来说听起来并不准确。

我相信您所描述的是自连接?我认为如果您使用此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中的这些操作:

在Dynamics CRM中,Linq查询是基于
QueryExpression
构建的,因此继承了它的限制。在
QueryExpression
中,过滤是使用
ConditionExpression
对象完成的。A
ConditionExpression
始终有两个或三个参数:

  • 属性名称(左侧)
  • 接线员
  • (可选)一个或多个文字值
  • 属性名称无法标识值

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

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

    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);
      }
     }