将LINQ中的LINQ查询与CRM结合会导致问题
本文关键字:LINQ 问题 结合 CRM 中的 查询 | 更新日期: 2023-09-27 17:54:23
有怪事发生
如果我这样做:
var allAccountsQuery = from acc in baseQ
where
//high potential check - 1, 2, 3
(acc.mcpl_potencjal_klienta == 1 || acc.mcpl_potencjal_klienta == 2 || acc.mcpl_potencjal_klienta == 3) &&
//directors block check
((acc.mcpl_blokada_dyrektorska == true && acc.mcpl_blokada_do <= date) || acc.mcpl_blokada_dyrektorska == false || acc.mcpl_blokada_dyrektorska == null) &&
//sack assign date check
(acc.mcpl_dataprzypisaniazworka == null || acc.mcpl_dataprzypisaniazworka < date) &&
//owner change check
(acc.mcpl_datazmianywasciciela == null || acc.mcpl_datazmianywasciciela < date) &&
//creation date check
//TODO:For testing!
//(acc.mcpl_data_utworzenia_test < date)
(acc.createdon < date)
select acc;
var joinQuery = from acc in allAccountsQuery
join opp in ctx.opportunityopportunities on acc.accountid equals opp.customerid.Value
select new
{
Account = acc,
Opportunity = opp
};
Plugins.Common.XrmHelper.ClearCache("account");
var joinResult = joinQuery.ToList();
那么在执行这个查询时,我将得到一个未知的平台错误。我需要将整个where
子句从allAccountsQuery
复制粘贴到joinQuery
并再次使用baseQ
,然后它就可以工作了。
这是怎么回事?我认为你可以安全地加入LINQ查询,只要你不做任何不支持的操作。
p。最奇怪的是,粘贴的代码将在略有不同的where
条件下工作。
pp。baseQ
只是一个更简单的where
查询,与allAccountsQuery
非常相似。
也许不是答案,但由于我不能留下评论,没有人有答案,我认为这可能会有所帮助。为什么不在第一个查询中执行连接呢?据我所知,LINQ CRM查询在我们有OR谓词的子句中有连接表的问题,而不是当我们尝试从不同的表中选择时,我认为您的查询应该工作。
与其他提供程序(例如EF的Linq-to-SQL)相比,Linq-to-CRM支持的操作集有限。
你可能会有更好的成功水合一个或两个查询。因为你的account
查询有一个where子句,试着补充它:
var joinQuery = from acc in allAccountsQuery.ToList() // call ToList() to hydrate the query
join opp in ctx.opportunityopportunities
on acc.accountid equals opp.customerid.Value
select new
{
Account = acc,
Opportunity = opp
};
如果您有大量的Opportunities
,您可能希望在执行Join
之前尝试根据第一个查询返回的帐户过滤该查询。