Linq orderby, не могу понять, как его использовать - PullRequest
0 голосов
/ 18 октября 2011

У меня есть эта функция:

/// <summary>
/// Return array of all badges for a users
/// </summary>
public static Badge[] getUserBadges(int UserID)
{
    Badge[] ReturnBadges;

    using (MainContext db = new MainContext())
    {
        var q = db.tblBadgeUsers
        .Where(c => c.UserID == UserID)
        .GroupBy(c => c.BadgeID)
        .Select(c => new { BadgeCount = c.Count(), TheBadge = c });

        ReturnBadges = new Badge[q.Count()];
        int i = 0;
        foreach (var UserBadge in q)
        {
            ReturnBadges[i] = new Badge(UserBadge.TheBadge.Key);
            ReturnBadges[i].Quantity = UserBadge.BadgeCount;
            i++;
        }
    }

    return ReturnBadges;
}

Я хочу заказать по tblBadges.OrderID ascending, но я не могу понять, где его поставить, кто-нибудь может помочь?

Я пробовал:

.OrderBy(c=> c.TheBadge.OrderID)

Но это не правильный код. TheBadge.Key в цикле имеет тип tblBadges. Меня немного смущает, почему intellisense не позволяет мне делать заказ в любом месте!

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

TheBadge это не одиночный значок , это группа значков ... так что я бы лично переименовал его на вашем месте.Теперь, какой OrderId вы хотите получить?У вас есть несколько сущностей в группе.Например, вы можете сделать это:

var q = db.tblBadgeUsers
    .Where(c => c.UserID == UserID)
    .GroupBy(c => c.BadgeID)
    .Select(c => new { BadgeCount = c.Count(), TheBadge = c })
    .OrderBy(x => x.TheBadge.First().OrderId);

Это упорядочит некоторый условный «первый» элемент - хотя я не знаю, как будет выглядеть сгенерированный SQL.

Если выожидайте, что OrderId будет одинаковым для каждого значка с тем же идентификатором, вы можете использовать:

var q = db.tblBadgeUsers
    .Where(c => c.UserID == UserID)
    .GroupBy(c => new { c.BadgeID, c.OrderID })
    .OrderBy(group => group.Key.OrderID)
    .Select(c => new { BadgeCount = c.Count(), TheBadge = c });
0 голосов
/ 18 октября 2011

Попробуйте:

    var q = db.tblBadgeUsers
    .Where(c => c.UserID == UserID)
    .GroupBy(c => c.BadgeID)
    .Select(c => new { BadgeCount = c.Count(), TheBadge = c.Key }) // *mod
    .OrderBy(c=> c.TheBadge.OrderID);      // * added

В следующей строке TheBadge представляет собой коллекцию linq, а не сам значок.Вы хотите c.Key.

    .Select(c => new { BadgeCount = c.Count(), TheBadge = c })
...