0

CRM 2011 の調査モジュールを開発しています。このモジュールでは、CRM ユーザーがさまざまな種類の複数の質問を含む調査を作成し、Azure の動的 Web ページを使用して連絡先に回答を求めることができます。これまでのところ、その約 90% を完了しており、データ管理に関連する小さな変更をいくつか追加する必要があるだけです。

現在最適化している部分には、質問の並べ替えが含まれます。CRM には、調査質問と質問の 2 つのエンティティがあります。question は調査の実際の質問を指しますが、surveyquestion はいくつかの追加フィールドを持つ NN 関係エンティティであるため、異なる調査で質問を再利用できます。質問をフォーム上の別の質問とグループ化する必要があるかどうかを示すために使用される「質問」に「グループ」フィールドがあります。「surveyquestion」に「volgorde」という別のフィールドがあり、質問の順序を示すために使用されます。同じ「グループ」を持つすべての質問をまとめて表示し、グループ内の質問 (およびグループ化されていない質問を別のグループとして) を sortorder フィールドで並べ替えたいと考えています。したがって、基本的には、2 つの異なるテーブルの 2 つのフィールドで注文する必要があります。

これは私が現在使用しているコードです。vr.Id と ev.slfn_vraag.Id の両方に関連する行にデータがあるため、vraaglist の結合で nullreferenceexception が発生します。上記のコメント付きのコードが機能するため、orderbyが原因ではないと思います(ただし、ev.volgordeをorderbyに単純に追加することはできません.

public List<slfn_vraag> GetVragenforEnquete(Guid enGuid)
    {
        //List<slfn_vraag> vraaglist = (from vr in _oContext.slfn_vraagSet
        //                              join ev in _oContext.slfn_enquetevraagSet on vr.Id equals ev.slfn_vraag.Id
        //                              orderby vr.slfn_Groep
        //                              where ev.slfn_enquete.Id == enGuid
        //                              select vr).ToList();

        IQueryable<slfn_enquetevraag> enquetevraaglist = (from ev in _oContext.slfn_enquetevraagSet
                                       orderby ev.slfn_volgorde
                                       where ev.slfn_enquete.Id == enGuid
                                       select ev);
        List<slfn_vraag> vraaglist = (from vr in _oContext.slfn_vraagSet
                                      join ev in enquetevraaglist on vr.Id equals ev.slfn_vraag.Id
                                      orderby vr.slfn_Groep
                                      select vr).ToList();
        return vraaglist;
    }

コードはエラーなしでコンパイルされますが、実行すると、質問クエリで NullReferenceException が発生します。誰もこれを修正する方法について何か考えがありますか?

編集: 以下で要求された VS2012 からの例外の詳細。

  System.NullReferenceException occurred
  HResult=-2147467261
  Message=De objectverwijzing is niet op een exemplaar van een object ingesteld.
  Source=Microsoft.Xrm.Sdk
  StackTrace:
       bij Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateJoin(QueryExpression qe, IList`1 methods, Int32& i, Projection& projection, List`1& linkLookups)
       bij Microsoft.Xrm.Sdk.Linq.QueryProvider.GetQueryExpression(Expression expression, Boolean& throwIfSequenceIsEmpty, Boolean& throwIfSequenceNotSingle, Projection& projection, NavigationSource& source, List`1& linkLookups)
       bij Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](Expression expression)
       bij Microsoft.Xrm.Sdk.Linq.QueryProvider.GetEnumerator[TElement](Expression expression)
       bij Microsoft.Xrm.Sdk.Linq.Query`1.GetEnumerator()
       bij System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       bij System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
       bij Enquete_Webform.Data.EnqueteGenerator.GetVragenforEnquete(Guid enGuid) in e:\VS\tfs_products\MS CRM\2011\Enquete\Enquete_Webform\Enquete_Webform\Data\EnqueteGenerator.cs:regel 49
  InnerException: 
4

3 に答える 3

1

null の ev.slfn_vraag があると思います。null 値を持つものを除外する where ステートメントを追加してみてください

List<slfn_vraag> vraaglist = (from vr in _oContext.slfn_vraagSet
                              join ev in enquetevraaglist on vr.Id equals ev.slfn_vraag.Id
                              where ev.slfn_vragg.Id != null
                              orderby vr.slfn_Groep
                              select vr).ToList();

最初のステートメントにも null を含めることができます。

var enquetevraaglist = (from ev in _oContext.slfn_enquetevraagSet
                        orderby ev.slfn_volgorde
                        where ev.slfn_enquete != null && ev.slfn_enquete.Id == enGuid
                        select ev)

エラーなしで null を許可する拡張メソッドを Entity Reference クラスに作成しました。

    /// <summary>
    /// Returns the Id of the entity reference or Guid.Empty if it is null"
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    public static Guid GetIdOrDefault(this EntityReference entity)
    {
        if (entity == null)
        {
            return Guid.Empty;
        }
        else
        {
            return entity.Id;
        }
    }

また、並べ替えに関する質問に関しては、CRM はリンクされたフィールドによる並べ替えをサポートしていません。そのことを覚えておいてください。

于 2013-09-13T11:52:34.703 に答える
1

Enumerable.OrderByおよびEnumerable.ThenByを finalvraaglistに適用すると、ケースの解決策が得られる場合があります。

于 2013-09-13T09:25:11.593 に答える