1

何か奇妙なことが起こっています。

私がこれを行う場合:

        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();

次に、このクエリを実行すると、不明なプラットフォーム エラーが発生します。whereWHOLE句を からallAccountsQueryにコピーして貼り付け、再度joinQuery使用する必要があります。baseQ

何が起きてる?サポートされていない操作を行わない限り、LINQ クエリに安全に参加できると思いました。

PS。最も奇妙な部分は、貼り付けられたコードがわずかに異なるwhere条件で機能することです。

PPS。baseQによく似た、さらに単純なwhereクエリallAccountsQueryです。

4

2 に答える 2

0

たぶん答えではないかもしれませんが、コメントを残すことができず、誰も答えを持っていないので、これは役立つと思います。最初のクエリで結合を行わないのはなぜですか?LINQ CRMクエリでは、OR述語がある句でテーブルを結合するときに問題が発生することがわかっていますが、別のテーブルから選択しようとすると、クエリが機能するはずです。私が学んだことを説明する投稿が1つあります。

于 2013-01-23T14:28:55.083 に答える
0

Linq-to-CRM は、他のプロバイダーの life EF または Linq-to-SQL と比較して、サポートされる操作のセットが限られています。

2 つのクエリのいずれかまたは両方をハイドレートすると、うまくいく場合があります。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.

于 2013-01-23T14:41:25.993 に答える