0

我正在为 CRM 2011 开发一个调查模块,CRM 用户可以使用 Azure 上的动态网页对多个不同类型的问题进行调查,并要求联系人回答这些问题。到目前为止,我已经完成了大约 90% 的工作,只需要添加一些涉及数据管理的小改动。

我目前正在优化的部分涉及对我的问题进行排序。我在 CRM 中有 2 个实体:surveyquest 和 question。question是指调查中的实际问题,而surveyquestion是一个NN关系实体,带有一些附加字段,因此我们可以在不同的调查中重复使用问题。我在“问题”中有一个“groep”字段,用于指示一个问题是否应该与表单上的另一个问题组合在一起。我还有一个字段,“surveyquestion”中的“volgorde”,用于表示问题的顺序。我希望将具有相同“组”的所有问题一起显示,然后按 sortorder 字段对组内的任何问题(以及未分组的问题作为单独的组)进行排序。所以我基本上需要对 2 个不同表中的 2 个字段进行排序,

这是我目前正在使用的代码。我在 vraaglist 的连接上得到一个 nullreferenceexception,这很奇怪,因为 vr.Id 和 ev.slfn_vraag.Id 在相关行中都有数据。我不认为这是由于 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

Enumerable.OrderByEnumerable.ThenBy应用于 final vraaglist,可能会为您的案例提供解决方案。

于 2013-09-13T09:25:11.593 回答
1

我猜你有一个 ev.slfn_vraag 是空的。尝试添加 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)

我在实体引用类上创建了一个扩展方法,它允许空值而不会出错。

    /// <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

在阅读了 Daryl 关于 FetchXML 的评论后,我决定将我的 LINQ 查询转换为 FetchXML,因为它确实支持链接实体排序。它现在可以正常工作,并且我得到了我需要的结果。

为了完成,这是我最终使用的 fetchXML:

<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
  <entity name='slfn_vraag'>
   <attribute name='slfn_vraagid' />
   <attribute name='slfn_vraag' />
   <attribute name='slfn_typevraag' />
   <attribute name='slfn_groep' />
   <order attribute='slfn_groep' descending='false' />
   <link-entity name='slfn_enquetevraag' from='slfn_vraag' to='slfn_vraagid' alias='aa'>
       <attribute name='slfn_volgorde'/>
       <order attribute='slfn_volgorde' descending='false' />
       <filter type='and'>
           <condition attribute='slfn_enquete' operator='eq' value='" + enGuid+@"' />
       </filter>
   </link-entity>
  </entity>
</fetch>

顺便说一句,没有一个字段可以为空,因为它们都是 CRM 中的主键和外键,链接到其他实体。

于 2013-09-16T12:54:45.910 回答