来自 OrganizationServiceProxy 的 Linq Queryable 在比较两个字段时抛出异常

Linq Queryable from OrganizationServiceProxy throws exception when comparing two fields

我试图减少此示例以删除 OrganizationServiceProxy/XrmServiceContext,但现在我认为问题出在此处。我正在使用 Microsoft CrmSvcUtil.exe 生成的代码从 Dynamics 365 实例中提取数据。这是相关的片段:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
CrmServiceClient client = new CrmServiceClient(userName, CrmServiceClient.MakeSecureString(password), string.Empty, orgName, isOffice365: true);

using (OrganizationServiceProxy service = client.OrganizationServiceProxy)
{
    XrmServiceContext crm = new XrmServiceContext(service);

    var q = crm.CreateQuery<Account>();

    List<Account> accounts = q.Where(x => x.AccountNumber != x.dynamics_integrationkey).ToList();
}

我得到以下异常:

variable 'x' of type '{company-specific}.Account' referenced from scope '', but it is not defined

这是在实际执行 Linq 时的最后一行发生的。只有当它通过 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext 创建时,我才会收到错误。

我检查过的东西:

很明显,List...ToQueryable() 和 Microsoft.Xrm.Sdk.Linq.Query<> 由 XrmServiceContext 创建(从 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext), 但不知道是什么

今天早上我意识到我的答案包含在 LINQ 查询中将两个字段相互比较的缺陷。我的错。谢谢 Guido 指出这是不可能的。

我使用第 3 方工具生成我的代理 classes,所以我不熟悉 XrmServiceContext class。但是,我已经确认 XrmServiceContext 继承自 Microsoft.Xrm.Client.CrmOrganizationServiceContext, which inherits from Microsoft.Xrm.Sdk.Client.OrganizationServiceContext

我使用 OrganizationServiceContext 进行 LINQ 查询。

如果您首先通过在查询中调用 ToList() 来检索所有帐户,然后您可以比较这两个字段。如果您有太多帐户无法一次全部加载,您可以翻阅它们并存储不匹配的帐户。
而且,我可能会检索字段的子集而不是整个记录(如图所示)。

var client = new CrmServiceClient(userName, CrmServiceClient.MakeSecureString(password), string.Empty, orgName, isOffice365: true);

using (var ctx = new OrganizationServiceContext(client))
{
    var q = from a in ctx.CreateQuery<Account>()
            where a.AccountNumber != null
            && a.dynamics_integrationkey != null
            select new Account 
            {
                Id = a.AccountId,
                AccountId = a.AccountId,
                Name = a.Name,
                AccountNumber = a.AccountNumber,
                dynamics_integrationkey = a.dynamics_integrationkey
            };

    var accounts = q.ToList();
    var mismatched = accounts.Where(a => a.AccountNumber != a.dynamics_integrationkey).ToList()
}

您尝试构建的查询(将一个字段值与同一实体上的另一个字段值进行比较)在 Dynamics 中是不可能的。

LINQ 提供程序仍然在后台使用 QueryExpression,这意味着您的 LINQ 条件将在 ConditionExpression 中转换,并且无法进行比较。

类似问题:

https://social.microsoft.com/Forums/en-US/d1026ed7-56fd-4f54-b382-bac2fc5e46a7/linq-and-queryexpression-compare-entity-fields-in-query?forum=crmdevelopment