LINQ Проверка всех записей в группе - PullRequest
2 голосов
/ 04 октября 2011

Я запрашиваю linqQuery из linqQuery2, потому что LINQ to CRM не поддерживает GroupBy. Приведенный ниже код работает, но он проверяет только первую найденную запись. Есть ли что-то вроде First (), но проверяет все записи, а не только First?

var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity")
select new
    {
        OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"],
        CustomerId = !r.Contains("customerid") ? string.Empty : ((EntityReference)r["customerid"]).Name,
        OwnerId = !r.Contains("ownerid") ? string.Empty : ((EntityReference)r["ownerid"]).Id.ToString(),
        OwnerName = !r.Contains("ownerid") ? string.Empty : ((EntityReference)r["ownerid"]).Name.ToString(),
        EmailedToRSM = !r.Contains("new_emailedtorsm") ? false : ((Boolean)r["new_emailedtorsm"]),
        LeadStatus = !r.Contains("new_leadstatus") ? "100000000" : ((OptionSetValue)r["new_leadstatus"]).Value.ToString(),
    });

var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerId into myGroup
    select new
        {
            OwnerName = myGroup.First().OwnerName,
            OwnerId = myGroup.First().OwnerId,
            LeadStatus = myGroup.First().LeadStatus.ToString(),
            EmailedToRSM = myGroup.First().EmailedToRSM,
            OrderCount = myGroup.Count()
        });

foreach (var c in linqQuery2)
{

        if (c.LeadStatus.ToString() == "100000000")
            {

            //Count records that have a Lead Status of 100000000

            }
}

Спасибо! * * 1004

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Звучит так, как будто вы хотите использовать все элементы в myGroup.Позвонив по номеру First(), вы ограничиваетесь только первым элементом.

Вы можете написать свой запрос следующим образом:

var query = from f in linqQuery.ToList()
            group f by f.OwnerId into myGroup
            from item in myGroup
            select new
            {
                OwnerName = item.OwnerName,
                OwnerId = item.OwnerId,
                LeadStatus = item.LeadStatus.ToString(),
                EmailedToRSM = item.EmailedToRSM,
                OrderCount = myGroup.Count()
            };

Однако учтите, что при этом вы будете сглаживатьрезультаты.

1 голос
/ 04 октября 2011

Непонятно, почему вы используете First() для начала.Как насчет:

var grouped = linqQuery.GroupBy(f => f.OwnerId).ToList();

Теперь каждая запись в «сгруппированных» является группировкой.Теперь вы можете использовать:

foreach (var group in grouped)
{
    Console.WriteLine("OwnerId: {0}", group.Key);
    int leadCount = group.Count(c => c.LeadStatus == 100000000);
    // etc - do what whatever else you want with the group

    // Let's dump all the customer IDs...
    foreach (var entry in group)
    {
        Console.WriteLine(entry.CustomerID);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...