Dynamics CRM:LINQ 中的复合键连接问题

Posted

技术标签:

【中文标题】Dynamics CRM:LINQ 中的复合键连接问题【英文标题】:Dynamics CRM: Problem with Composite Key Join in LINQ 【发布时间】:2021-04-30 22:40:09 【问题描述】:

我在 LINQ to LEFT JOIN 同一实体中有以下查询:

  query = from a in orgSvcContext.CreateQuery("entity1")
            join b in orgSvcContext.CreateQuery("entity1")
            on new  v1 = a["field1"], v2 = a["field2"]  equals new  v1 = b["field2"], v2 = b["field1"]  into gr
            from c_joined in gr.DefaultIfEmpty()
            where c_joined["field0"] == null && (a["field1"].Equals(new Guid(@param)) || a["field2"].Equals(new Guid(@param)))
            select a;

它抱怨以下错误:

“加入”条件无效。实体成员正在调用无效 属性或方法

我从这里参考:https://docs.microsoft.com/en-us/dotnet/csharp/linq/join-by-using-composite-keys

我的JOIN 有什么问题吗?如果我只是使用,我没有问题

on a["field1"] equals  b["field2"]

提前致谢。

【问题讨论】:

【参考方案1】:

new v1 = a["field1"], v2 = a["field2"] 构造无法解析为属性名称。

Dynamics CRM 的 LINQ 实现非常有限,因为它试图将 LINQ 表达式转换为 QueryExpression 查询。这些查询又只实现了 SQL 语言的一个基本子集。

当加入两个实体时,请确保在on 之后,左侧和右侧可以解析为两个实体的现有查找属性。

请记住,并非所有 QueryExpression 功能都可以在 LINQ 查询中使用。

【讨论】:

我之前读过一个帖子。它提到 FetchXml 和 QueryExpress 不支持复合键 JOIN,但 LINQ 在 Dynamic CRM 中支持。这就是我使用 LINQ 的原因。 ***.com/questions/4046711/… 啊,我明白了。该线程的 OP 写道,他使用 LINQ 来连接两个查询的结果。这两个结果集必须是物化集合,因此连接可以充分利用对象的 LINQ。在这种情况下,根本不会调用 LINQ for CRM。在您的情况下,您将直接加入在 OrganizationServiceContext 上创建的 IQueryable,这就是 LINQ for CRM 介入的原因,但存在所有限制。

以上是关于Dynamics CRM:LINQ 中的复合键连接问题的主要内容,如果未能解决你的问题,请参考以下文章

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)

Dynamics 365 CRM - 从SSRS报告中删除外部联接重复项

如何通过 Dynamics 365 CRM 中的 C# 插件填充查找字段

尝试 Web API Dynamics 365 CRM - 403-禁止错误

Dynamics CRM 中的 CalculatePrice 消息

Dynamics CRM - 如何通过 C# Plugin 给 Contact的 主键(FullName)赋值