来自 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...AsQueryable()
替换 crm.CreateQuery...
,Linq 工作正常
- 最令人沮丧的是,如果我使用
List<Account> a = q.ToList();
通过中间列表首先对结果集进行栅格化,那么一切正常。 运行 需要更长的时间,因为我放弃了任何延迟加载,但它可以正常工作。
- 我查看了与 referenced from scope '' but not defined Linq 错误相关的其他答案,但它们都是关于格式错误的 Linq。我知道这个 Linq 格式正确,因为如果我更改底层 Queryable,它工作正常。
很明显,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 中转换,并且无法进行比较。
类似问题:
我试图减少此示例以删除 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...AsQueryable()
替换crm.CreateQuery...
,Linq 工作正常 - 最令人沮丧的是,如果我使用
List<Account> a = q.ToList();
通过中间列表首先对结果集进行栅格化,那么一切正常。 运行 需要更长的时间,因为我放弃了任何延迟加载,但它可以正常工作。 - 我查看了与 referenced from scope '' but not defined Linq 错误相关的其他答案,但它们都是关于格式错误的 Linq。我知道这个 Linq 格式正确,因为如果我更改底层 Queryable,它工作正常。
很明显,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 中转换,并且无法进行比较。
类似问题: