检索n到n条记录

时间:2011-12-21 16:10:15

标签: c# plugins dynamics-crm-2011

(不,再不是法国女孩!!!)

所以...我有两个具有n-n关系的实体:“new_produit”和“new_lignecontrat”。 我需要将最后一个“new_lignecontrat”记录的“new_produit”记录复制到新创建的“new_lignecontrat”中。

插件在Create for new_lignecontrat上触发。

到目前为止,我已经写了这篇文章,但我不太确定要复制“new_produit”记录的步骤......

            else if (modeleContrat.Id.Equals (ContratForfaitaire))
            {

                FetchExpression fetch = new FetchExpression(@"
                    <fetch distinct='false' mapping='logical'>
                      <entity name='new_contrats'><link-entity name='" + context.PrimaryEntityName + "' alias='nombreligne' from='new_contratsid' to='new_contratsid'><filter type='and'><condition attribute='new_contratsid' value='" + contrats.Id + "' operator='eq'></condition></filter></link-entity></entity></fetch>");
                EntityCollection lines = service.RetrieveMultiple(fetch);

                if (lines.Entities.Any())
                {
                    var last = lines.Entities.Last();

                    if (last.GetAttributeValue<OptionSetValue>("statecode").Value == 1)
                    {

                        QueryExpression query = new QueryExpression();
                        query.EntityName = "new_produit";
                        query.ColumnSet = new ColumnSet("new_produitid");
                        Relationship relationship = new Relationship();

                        // name of relationship between team & systemuser
                        relationship.SchemaName = "new_new_lignecontrat_new_produit";
                        RelationshipQueryCollection relatedEntity = new RelationshipQueryCollection();
                        relatedEntity.Add(relationship, query);
                        RetrieveRequest request = new RetrieveRequest();
                        request.RelatedEntitiesQuery = relatedEntity;
                        request.ColumnSet = new ColumnSet("new_lignecontratid");
                        request.Target = new EntityReference
                        {
                            Id = last.Id,
                            LogicalName = last.LogicalName

                        };

                        RetrieveResponse response = (RetrieveResponse)service.Execute(request);



                        if (((DataCollection<Relationship, EntityCollection>)(((RelatedEntityCollection)(response.Entity.RelatedEntities)))).Contains(new Relationship("new_new_lignecontrat_new_produit")) && ((DataCollection<Relationship, EntityCollection>)(((RelatedEntityCollection)(response.Entity.RelatedEntities))))[new Relationship("new_new_lignecontrat_new_produit")].Entities.Count > 0)
                        {
                            response.Entity.Attributes.Remove("new_produitid");
                            response["new_lignecontratid"] = new EntityReference(target.LogicalName, target.Id);

1 个答案:

答案 0 :(得分:3)

我相信我已回答one of your previous questions部分回答了这个问题,所以让我们看看这次我的回答是否更好。

如果我正确理解问题,这个问题的三个步骤是首先获取在创建当前new_lignecontrat记录之前创建的最后new_lignecontrat条记录,然后获取所有{{1与最后new_produit相关联的记录,最后new_lignecontrat每个Associate记录与新new_produit记录相关联的记录。

  1. 对于此查询,您可以使用Dynamics(FetchXml,QueryExpression和Linq)中三种支持的查询方法中的任何一种。我更喜欢Linq,因为new_lignecontrat方法是执行高效.First()查询(获取上次创建的TOP记录)的简单方法,但您也可以使用FetchXml和分页cookie完成同样的事情(不确定QueryExpression)。

  2. 您可以使用N:N表和步骤1中检索到的ID获取链接的new_lignecontrat记录。

  3. 获得新new_produit的ID以及最后关联的new_lignecontrat记录的ID后,执行针对这些new_produit的{​​{1}}方法记录和他们的关系。下面是一个处理这三个步骤的模型。

  4. Associate