Есть ли способ написать группу по запросу в группе LinqToSql не по скалярному значению? - PullRequest
1 голос
/ 10 октября 2008

У меня есть эти карты в моем хранилище.

public IQueryable<AwType> GetAwTypes()
{
    return from awt in _db.AwTypes
           select new AwType
           {
               Id = awt.Id,
               Header = awt.Header,
               Description = awt.Description
           };
}

public IQueryable<Aw> GetAws()
{
    return from aw in _db.Aws
           select new Aw
           {
               Id = aw.Id,
               Bw = (from bw in GetBws()
                          where bw.Id == aw.Bw
                             select bw
                         ).SingleOrDefault(),
               AwType = (from awt in GetAwTypes()
                            where awt.Id == awAwType
                            select awt
                        ).SingleOrDefault(),
               AwAttribute = aw.AwAttribute
           };
}

В сервисе я хочу получить количество Bws, сгруппированных по AwType как List<KeyValuePair<AwType, int>>. Когда я вызываю этот запрос linq:

var awGroups = from aw in _repository.GetAws()
group aw by aw.AwType into newGroup
select newGroup;

List<KeyValuePair<AwType, int>> RetGroups = new List<KeyValuePair<AwType, int>>();
foreach (var group in awGroups)
{
    RetGroups.Add(new KeyValuePair<AwType, int>(group.Key, group.Count()));
}
return RetGroups;

Я получаю сообщение об ошибке, в котором говорится, что я не могу сгруппировать объект, который нужно сгруппировать по скалярному значению, например aw.AwType.Id.

Есть ли способ получить пары "AwType, int" за один вызов?

Ответы [ 3 ]

1 голос
/ 13 октября 2008

AwType является ссылочным типом. Было бы плохой идеей группировать по этому ссылочному типу ... Каждый AwType в этом запросе является уникальной ссылкой, поэтому n элементов будут давать n групп.

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

var awGroups = from aw in _repository.GetAws()
group aw by aw.AwType.ID into newGroup  //changed to group on ID
select newGroup;

List<KeyValuePair<AwType, int>> RetGroups = new List<KeyValuePair<AwType, int>>();
foreach (var group in awGroups)
{
    //changed to get the first element of the group and examine its AwType
    RetGroups.Add(new KeyValuePair<AwType, int>(group.First().AwType, group.Count()));
}
return RetGroups;
0 голосов
/ 13 октября 2008

Исходя из того, что я понимаю в linq, вы были бы эквивалентны попытке группировать по каждому столбцу таблицы. Это можно сделать, перечислив каждое отдельное поле в таблице в операторе группы, поэтому в вашем случае вам нужно будет сделать следующее (я не очень разбираюсь в Linq)

var awGroups = from aw in _repository.GetAws()
group aw by aw.AwType.Id, aw.AwType.Header, aw.AwType.Description into newGroup
select newGroup;

или, может быть, вы можете просто сгруппировать по Id, если это единственный столбец, который вам нужен.

var awGroups = from aw in _repository.GetAws()
group aw by aw.AwType.Id into newGroup
select newGroup;
0 голосов
/ 10 октября 2008

Вы можете группировать по анонимному типу, например, new {Foo, Bar}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...