【问题标题】:Combining LINQ queries in LINQ to CRM causes problems?在 LINQ to CRM 中组合 LINQ 查询会导致问题吗?
【发布时间】:2013-01-18 11:47:28
【问题描述】:

发生了一些奇怪的事情。

如果我这样做:

        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 查询。

PS。最奇怪的部分是粘贴的代码将在略有不同的where 条件下工作。

PPS。 baseQ 只是一个更简单的 where 查询,很像 allAccountsQuery

【问题讨论】:

    标签: c# linq dynamics-crm-4


    【解决方案1】:

    也许不是答案,但由于我无法发表评论,也没有人回答,我认为这可能会有所帮助。 为什么你不在第一个查询中加入?据我所知,LINQ CRM 查询在我们有 OR 谓词的子句中加入表时存在问题,而不是当我们尝试从不同的表中进行选择时,我认为查询应该可以工作。我有一个post 解释我学到的东西。

    【讨论】:

    • 我不能先加入,因为 LINQ to CRM (4.0) 加入是内部加入。尝试进行左连接以 CRM 向我抛出异常而告终。
    【解决方案2】:

    与其他提供程序生命 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 之前尝试根据从第一个查询返回的帐户过滤该查询。

    【讨论】:

    • 我发布的查询的奇怪之处在于,即使不考虑连接,它有时也会突然停止工作(当我在 allAccountsQuery 上尝试 .ToList() 时......就像我写的那样,奇怪.o_O
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多