2014-11-11 1 views
0

У меня есть следующий код, и я пытаюсь найти более элегантный подход к этому. activityParty - это DataCollection. Я в основном пытаюсь получить список получателей для электронной почты, которые могут быть типа пользователей или контактов.CRM Late Bound - Cleaner Approach

Я знаком с ранней оценкой, но в этом сценарии необходимо использовать позднюю границу.

Есть ли лучший подход к этому?

var recipientParty = activityParty.Where(x => x.GetAliasedValueOrDefault<OptionSetValue>("ap.participationtypemask").Value == 2).ToList(); 
var recipientList = new List<string>(); 

foreach (var to in recipientParty) 
{ 
    if (to.Attributes.Contains("u.internalemailaddress")) 
    { 
     recipientList.Add(to.GetAliasedValueOrDefault<string>("u.internalemailaddress")); 
    } 

    if (to.Attributes.Contains("c.emailaddress1")) 
    { 
     recipientList.Add(to.GetAliasedValueOrDefault<string>("c.emailaddress1")); 
    } 
} 
+0

проверить, может ли это помочь http://www.crmanswers.net/2014/09/getattributevalue-activityparty.html –

ответ

0

Попробуйте это:

using (var serviceContext = new OrganizationServiceContext(this.OrganizationService)) // if you are writing custom code activity 
//using (var serviceContext = new OrganizationServiceContext(localContext.OrganizationService)) // if you are writing plugin 
{ 
    var activityPartySet = serviceContext.CreateQuery<ActivityParty>(); 
    var activityParties = activityPartySet.Where(
           ap => ap.PartyId != null && 
           ap.ParticipationTypeMask != null && 
           ap.ParticipationTypeMask.Value == 2).ToList(); 

    var userSet = serviceContext.CreateQuery<SystemUser>(); 
    var contactSet = serviceContext.CreateQuery<Contact>(); 
    var recipientList = new List<string>(); 
    foreach (var ap in activityParties) 
    { 
     var partyRef = ap.PartyId; 
     if (partyRef.LogicalName == SystemUser.EntityLogicalName) 
     { 
      var user = (from u in userSet 
         where u.Id == partyRef.Id 
         select new SystemUser 
         { 
          InternalEMailAddress = u.InternalEMailAddress 
         }).FirstOrDefault(); 

      if (user != null) 
       recipientList.Add(user.InternalEMailAddress); 
     } 
     else if (partyRef.LogicalName == Contact.EntityLogicalName) 
     { 
      var contact = (from c in contactSet 
          where c.Id == partyRef.Id 
          select new Contact 
          { 
           EMailAddress1 = c.EMailAddress1 
          }).FirstOrDefault(); 

      if (contact != null) 
       recipientList.Add(contact.EMailAddress1); 
     } 
    } 
} 

Надеется, что это помогает!

+0

Спасибо за ответ, но я использую Late Bound – Andrew

0

Посмотрите на AddressUsed объект ActivityParty объект. Он должен содержать адрес электронной почты, независимо от того, какой объект является источником вовлеченной стороны.

Таким образом, в вашем коде вы можете использовать to.AddressUsed вместо цельного, если {...}.