Получение n записей - PullRequest
       18

Получение n записей

1 голос
/ 21 декабря 2011

(нет, опять не француженка !!!)

Итак ... У меня есть две сущности с n-n отношениями: "new_produit" и "new_lignecontrat". Мне нужно скопировать записи "new_produit" последней записи "new_lignecontrat" ​​во вновь созданную запись "new_lignecontrat".

Плагин запускается при создании для 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 Ответ

3 голосов
/ 22 декабря 2011

Мне кажется, я частично ответил на этот вопрос в ответ на один из ваших предыдущих вопросов , поэтому давайте посмотрим, будет ли мой ответ лучше на этот раз.

Три шага в этой проблеме,если я правильно понимаю проблему, это сначала получить последнюю запись new_lignecontrat, созданную до создания текущей записи new_lignecontrat, затем получить все записи new_produit, связанные с последней new_lignecontrat, и, наконец, Associateкаждая из этих new_produit записей с новой new_lignecontrat записью.

  1. Для этого запроса вы можете использовать любой из трех поддерживаемых методов запроса в Dynamics (FetchXml, QueryExpression и Linq).Я предпочитаю Linq, так как метод .First() - это простой способ выполнить эффективный запрос TOP (чтобы получить вашу последнюю созданную запись new_lignecontrat), но вы также можете использовать FetchXml и файл подкачки для достижения того же результата (не уверено QueryExpression).

  2. Вы можете получить связанные записи new_produit, используя таблицу N: N и идентификатор, полученный на шаге 1.

  3. Получив идентификатор новых new_lignecontrat и идентификаторы последних связанных new_produit записей, выполните метод Associate вашего IOrganizationService для этих записей и их взаимосвязей.Ниже приведен макет, который обрабатывает эти три шага.

using (OrganizationServiceContext osc = new OrganizationServiceContext(service))
{
    //assumes early binding, but this can be modified for late binding as well
    Guid ligneContratID = (from lc in osc.CreateQuery<new_ligneContrat>()
                           where lc.CreatedOn < (DateTime)targetEntity.Attributes["CreatedOn"] //look at all new_ligneContrat records created before the newly created record
                           orderby lc.CreatedOn descending //sort newest to oldest
                           select lc.new_ligneContratID)
                           .First(); //get the newest record

    var produits = from lcp in osc.CreateQuery<new_new_lignecontrat_new_produit>()  //use your N:N relationship/table as your linking table
                   join p in osc.CreateQuery<new_produit>() on lcp.new_produitId equals p.new_produitId
                   where lcp.new_lignecontratId = ligneContratID //use the previous query result in your N:N lookup
                   select p.new_produitId;                        

    EntityReferenceCollection erc = new EntityReferenceCollection();
    foreach (var e in produits)
    {
        erc.Add(new EntityReference("new_produit", e));
    }

    service.Associate("new_lignecontrat", targetEntity.Id, new Relationship("new_new_lignecontrat_new_produit", erc);
}
...