将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中的LINQ查询与CRM结合会导致问题

也许不是答案,但由于我不能留下评论,没有人有答案,我认为这可能会有所帮助。为什么不在第一个查询中执行连接呢?据我所知,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之前尝试根据第一个查询返回的帐户过滤该查询。