我试图改变动态crm中的一些数据。 为了实现这一目标,我想编写一个插件来搜索具有特殊标准的实体。
到目前为止,没那么特别。我可以进行QueryExpression并搜索"字段A"诱惑A具有"该值" (例如,字符串)
现在有什么不同,我想测试"字段A"等于"字段B"。
在T-SQL中它会是 select * where table1.fielda = table1.fieldb
所以我想将一个实体记录的属性值与同一个实体记录的属性值相匹配。
我搜索并找到了一种方法,您可以在QueryExpression中的表上进行连接(可以在此处找到API参考:https://msdn.microsoft.com/en-us/library/dn481591.aspx),但我无法找到如何使用它我的porpuse,如果它符合我的要求,或者它是错误的方式。
那么,有人这样做了吗?
THX
---- ---- UPDATE
到目前为止我尝试了什么: 根据@Brendon Colburn提供的帖子 我尝试构建自我加入LINQ查询。
遗憾的是,构建查询限制了我试图实现的目标:
您无法构建要将字段与另一个字段进行比较的查询。
(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();
抛出错误 类型为&#39; System.InvalidOperationException&#39;的未处理异常发生在ConsoleApplication1.exe
中所以,最终它似乎不可能以良好的方式存档它。
似乎我最终会搜索我想查看的所有实体记录,并根据我在for-each循环中确定的条件查找记录。 :(((
答案 0 :(得分:0)
在Dynamics CRM中,Linq查询基于QueryExpression
构建,因此继承了其局限性。在QueryExpression
过滤使用ConditionExpression
个对象完成。 ConditionExpression
始终有两个或三个参数:
无法通过属性名称识别值。
因此,当您无法通过联接获得所需的结果时,您唯一的选择是查询超出实际需要的记录并在之后过滤它们。
在完全信任(仅限内部部署)模式下执行的插件中,实际上可以直接访问CRM数据库并执行SQL查询,但这有点像黑客。
答案 1 :(得分:-1)
老实说,我只是认为你做错了什么。您在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