2011-09-24 4 views
1

동일한 "소유자"이름을 가진 CRM 레코드를 GROUP하려고하며 각 그룹의 레코드 수를 얻으려고합니다. 그래서 일정에 따라 실행되고 CRM 2011에서 정보를 가져 오는 DLL이 있습니다. 그러나 그룹화하고 각 그룹에 대한 레코드 수를 계산할 수는 없습니다. 예를 들어 소유자가 "Bob"인 모든 레코드는 Bob에게 X 레코드가 있다고 표시합니다. 그리고 "Ted"의 소유자와 가진 기록은 Ted에게 X 기록 등이 있다고 말할 것입니다. 모든 소유자에게 있습니다. 어떤 생각을 어떻게 할 것인가? 이것은 내가 지금까지 가지고있는 것입니다 :CRM 2011 GROUP AND COUNT

   var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity") 
          join c in orgServiceContext.CreateQuery("systemuser") on ((EntityReference)r["ownerid"]).Id equals c["systemuserid"] into opp 
          from o in opp.DefaultIfEmpty() 
          //where ((OptionSetValue)r["new_leadstatus"]).Equals("100000002") 
          select new 

          { 
           OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"], 
           CustomerId = !r.Contains("customerid") ? string.Empty : ((EntityReference)r["customerid"]).Name, 
           Priority = !r.Contains("opportunityratingcode") ? string.Empty : r.FormattedValues["opportunityratingcode"], 
           ContactName = !r.Contains("new_contact") ? string.Empty : ((EntityReference)r["new_contact"]).Name, 
           Source = !r.Contains("new_source") ? string.Empty : ((String)r["new_source"]), 
           CreatedOn = !r.Contains("createdon") ? string.Empty : ((DateTime)r["createdon"]).ToShortDateString(), 
           Eval = !r.Contains("new_distributorevaluation") || ((OptionSetValue)r["new_distributorevaluation"]).Value.ToString() == "100000000" ? "NA" : r.FormattedValues["new_distributorevaluation"].Substring(0, 2), 
           EvalVal = !r.Contains("new_distributorevaluation") ? "100000000" : ((OptionSetValue)r["new_distributorevaluation"]).Value.ToString(), 
           DistributorName = !r.Contains("new_channelpartner") ? string.Empty : ((EntityReference)r["new_channelpartner"]).Name, 
           Notes = !r.Contains("new_distributornotes") ? string.Empty : r["new_distributornotes"], 
           EstimatedCloseDate = !r.Contains("estimatedclosedate") ? string.Empty : r["estimatedclosedate"], 
           MaturityValue = !r.Contains("estimatedvalue") ? string.Empty : ((Money)r["estimatedvalue"]).Value.ToString(), 
           SentToDistributorOn = !r.Contains("new_senttodistributoron") ? DateTime.MinValue.ToShortDateString() : ((DateTime)r["new_senttodistributoron"]).ToShortDateString(), 
           LeadStatus = !r.Contains("new_leadstatus") ? string.Empty : ((OptionSetValue)r["new_leadstatus"]).Value.ToString(), 
           EmailedToRSM = !r.Contains("new_emailedtorsm") ? string.Empty : r.FormattedValues["new_emailedtorsm"], 
           EmailedToDistributor = !r.Contains("new_emailedtodistributor") ? string.Empty : r.FormattedValues["new_emailedtodistributor"], 
           Owner = !r.Contains("ownerid") ? string.Empty : ((EntityReference)r["ownerid"]).Name, 
           OwnerEmail = !o.Contains("internalemailaddress") ? string.Empty : ((String)o["internalemailaddress"]), 
          }).ToArray(); 

      foreach (var distributor in linqQuery) 
      { 



       DateTime dtCreatedOn = Convert.ToDateTime(distributor.CreatedOn); 
       DateTime dtSentOn = Convert.ToDateTime(distributor.SentToDistributorOn); 

       // New Lead Notification 
        if (((distributor.Owner.ToString() == distributor.Owner.ToString()) && (DateTime.Now - dtCreatedOn).Days <= 1) && (distributor.LeadStatus == "100000000") && ((distributor.EmailedToRSM == "No") || (distributor.EmailedToRSM == null)) && (String.IsNullOrEmpty(distributor.Owner.ToString()) == false)) 
        { 

         int count = 0; 
         count = count + 1; 
         string lBodyHTML = ""; 

         lBodyHTML = "You have " + distributor.CustomerId.ToString() + " " + distributor.CreatedOn.ToString() + " " + count.ToString() + " new leads. Please review them for follow up or assignment."; 

         string smtpServer = Convert.ToString(Globals.HostSettings["SMTPServer"]); 
         string smtpAuthentication = Convert.ToString(Globals.HostSettings["SMTPAuthentication"]); 
         string smtpUsername = Convert.ToString(Globals.HostSettings["SMTPUsername"]); 
         string smtpPassword = Convert.ToString(Globals.HostSettings["SMTPPassword"]); 
         string xResult = Mail.SendMail("[email protected]", "[email protected]", "", "", MailPriority.High, "You have X new leads", MailFormat.Html, System.Text.Encoding.UTF8, lBodyHTML, "", smtpServer, smtpAuthentication, smtpUsername, smtpPassword); 

        } 

어떤 도움이 굉장합니다. 나는 지금 당황했다.

감사합니다.

답변

0

이 시도 :

var linqQuery = 
    from r in orgServiceContext.CreateQuery("opportunity") 
    join c in orgServiceContext.CreateQuery("systemuser") on ((EntityReference)r["ownerid"]).Id equals c["systemuserid"] 
    group r by ((EntityReference)r["ownerid"]).Id into oop 
    select new 
    { 
     Key = oop.Key, 
     Count = oop.Count(), 
     Opportunities = oop //contains the list of opportunities grouped by OwnerId 
    }; 

Opportunities 당신은 당신이 관심있는 회원들과 기회의 목록을 작성 컬렉션 IEnumerable<Microsoft.Xrm.Sdk.Entity>을 반복해야한다 IGrouping 의 컬렉션을 포함합니다. (투사가 새 연산자를 사용하여 만든)

var outputOpportunities = new ArrayList(); 
foreach (IGrouping<Guid, Microsoft.Xrm.Sdk.Entity> group in linqQuery) 
{ 
    foreach (Microsoft.Xrm.Sdk.Entity opportunity in group) 
     outputOpportunities.Add 
     (new 
      { 
       OpportunityId = !opportunity.Contains("opportunityid") ? string.Empty : opportunity["opportunityid"], 
       CustomerId = !opportunity.Contains("customerid") ? string.Empty : ((EntityReference)opportunity["customerid"]).Name, 
       Priority = !opportunity.Contains("opportunityratingcode") ? string.Empty : opportunity.FormattedValues["opportunityratingcode"], 
       ContactName = !opportunity.Contains("new_contact") ? string.Empty : ((EntityReference)opportunity["new_contact"]).Name, 
       Source = !opportunity.Contains("new_source") ? string.Empty : ((String)opportunity["new_source"]), 
       CreatedOn = !opportunity.Contains("createdon") ? string.Empty : ((DateTime)opportunity["createdon"]).ToShortDateString(), 
       Eval = !opportunity.Contains("new_distributorevaluation") || ((OptionSetValue)opportunity["new_distributorevaluation"]).Value.ToString() == "100000000" ? "NA" : opportunity.FormattedValues["new_distributorevaluation"].Substring(0, 2), 
       EvalVal = !opportunity.Contains("new_distributorevaluation") ? "100000000" : ((OptionSetValue)opportunity["new_distributorevaluation"]).Value.ToString(), 
       DistributorName = !opportunity.Contains("new_channelpartner") ? string.Empty : ((EntityReference)opportunity["new_channelpartner"]).Name, 
       Notes = !opportunity.Contains("new_distributornotes") ? string.Empty : opportunity["new_distributornotes"], 
       EstimatedCloseDate = !opportunity.Contains("estimatedclosedate") ? string.Empty : opportunity["estimatedclosedate"], 
       MaturityValue = !opportunity.Contains("estimatedvalue") ? string.Empty : ((Money)opportunity["estimatedvalue"]).Value.ToString(), 
       SentToDistributorOn = !opportunity.Contains("new_senttodistributoron") ? DateTime.MinValue.ToShortDateString() : ((DateTime)opportunity["new_senttodistributoron"]).ToShortDateString(), 
       LeadStatus = !opportunity.Contains("new_leadstatus") ? string.Empty : ((OptionSetValue)opportunity["new_leadstatus"]).Value.ToString(), 
       EmailedToRSM = !opportunity.Contains("new_emailedtorsm") ? string.Empty : opportunity.FormattedValues["new_emailedtorsm"], 
       EmailedToDistributor = !opportunity.Contains("new_emailedtodistributor") ? string.Empty : opportunity.FormattedValues["new_emailedtodistributor"], 
       Owner = !opportunity.Contains("ownerid") ? string.Empty : ((EntityReference)opportunity["ownerid"]).Name, 
       OwnerEmail = !opportunity.Contains("internalemailaddress") ? string.Empty : ((String)opportunity["internalemailaddress"]) 
      } 
     ); 
}   

는 기본적으로 나는 쿼리를 가져다가 group by 연산자를 추가 투사 문에 내가 ownerid로 카운트를 넣어.

+0

감사! 나는 시도해 봤는데 나는이 오류가 발생한다 : "오류 'System.Linq.IGrouping '에는 'Contains'및 최상의 확장 방법에 대한 정의가 포함되어 있지 않습니다. overload 'System.Linq.ParallelEnumerable.Contains (System.Linq.ParallelQuery , TSource)'잘못된 인수가 있습니다. " 감사! –

+0

고마워요! 나는 내가 더 가까웠다 고 생각한다. ""이 줄에 "System.Linq.IGrouping "형식으로 'AnonymousType # 1'형식을 변환 할 수 없습니다 "foreach (IGrouping linqQuery의 그룹) "어떤 생각? 당신의 도움을 주셔서 감사합니다! –

관련 문제