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
总是有两个或三个参数:
- 属性名称(左侧)
- 一个操作员
- (可选)一个或多个文字值
属性名称无法识别值。
因此,当您无法通过联接获得所需的结果时,唯一的选择是查询比实际需要更多的记录,然后再过滤它们。
在以完全信任(仅限本地)模式执行的插件中,实际上可以直接访问 CRM 数据库并执行 SQL 查询,但这有点 hack。
我正在尝试更改 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
总是有两个或三个参数:
- 属性名称(左侧)
- 一个操作员
- (可选)一个或多个文字值
属性名称无法识别值。
因此,当您无法通过联接获得所需的结果时,唯一的选择是查询比实际需要更多的记录,然后再过滤它们。
在以完全信任(仅限本地)模式执行的插件中,实际上可以直接访问 CRM 数据库并执行 SQL 查询,但这有点 hack。