Priya-Kiko Ответов: 2

Как выполнить группировку по первым нескольким символам столбца в LINQ и получить счетчик


Привет,

У меня есть таблица сущностей по имени "места". Записи в этой таблице выглядят следующим образом :

Код
10A
10B
10C
10D
11A
11C
11D
11E
312A
312B... so on


Здесь, например : 10A -> A-это идентификатор сиденья, а 10-это стол, к которому прикреплено сиденье, если его 312B, то 312-это идентификатор стола, А B-идентификатор сиденья.

Мне нужно получить различные имена таблиц из вышеприведенной коллекции вместе с количеством мест вокруг этого стола, например :

Code        Seats
10------------4
11------------4
312-----------2


Как я могу этого достичь? Пожалуйста, предложите. Заранее спасибо.

Что я уже пробовал:

private class tables
{
    public String code { get; set; }
    public Int32 noseats { get; set; }
}

List<tables> lstTables = new List<tables>();
	
lstTables = (from tablrow in Context.seats.AsEnumerable()
            group tablrow by 
            new { tabcode = apputils.Left(tablrow.code, tablrow.code.Length - 1) } 
            into g
            select new tables { code = g.Key.tabcode, noseats = g.Count(g) }).ToList();


Это возвращает ошибку,
Argument 2: cannot convert from 'System.Linq.IGrouping<<anonymous type: string tabcode>, db.seats>' to 'System.Func<db.seats, bool>'

Gerry Schmitz

Очевидно, что если вы отформатируете данные (в таблицу и место) "до" запроса, все будет проще.

Priya-Kiko

Спасибо за ответ.

2 Ответов

Рейтинг:
2

Maciej Los

Предполагая, что Context.seats возвращает список string...

string pattern = @"\d+";
List<tables> lstTables = Context.seats.ToList()
    .GroupBy(s=>Regex.Match(s, pattern).Value)
    .Select(grp=>new tables()
        {
            code = grp.Key,
            noseats = grp.Count()
        })
    .ToList();


Priya-Kiko

Спасибо за ваше время и предложение.

Рейтинг:
12

BillWoodruff

попробовать это:

Dictionary<int, int> SeatsByTableID = lstTables
    .GroupBy(tbl => tbl.TableId)
    .ToDictionary(grp => grp.Key, grp => grp.Count());
Обратите внимание, что я нахожу ваше имя неуместным: если идентификатор таблицы-это целое число, то почему вы называете его "носы"?

Я предполагаю, что здесь должен быть ваш класс:
private class Table
{
    public Table(int tableId, string seatcode)
    {
        this.TableId = tableId;
        this.SeatCode = seatcode;
    }

    public int TableId { get; set; }
    public String SeatCode { get; set; }
}
Обновление:

Если вы действительно хотите IEnumerable;
var IESeatsByTableID = lstTables
    .GroupBy(tbl => tbl.TableId)
    .Select(grp => new {TblId = grp.Key, NSeats = grp.Count()});
Имейте в виду, что результат-это:

{System.Linq.Перечислимый.WhereSelectEnumerableIterator&ЛТ;система.в LINQ.igrouping&ЛТ;инт fourformui.таблица=""&ГТ;, &ЛТ;&ГТ;Ф__AnonymousType0 И Л;int, int с=""&ГТ;&ГТ;}

И это зависит от вас, чтобы запомнить имена внутренних полей, 'TableId и 'NSeats, когда вы используете IEnumerable.


Priya-Kiko

Большое вам спасибо, @BillWoodruff. Применив ваше предложение, я смог добиться именно того, чего хотел. Спасибо снова.

Ну, "носы" означает "количество мест" против этого стола, для внутреннего понимания.

Я изменил свой код на :

Словарь<string, int32=""> SeatsByTableID =
Контекст.места.Методом asenumerable()
.GroupBy(tbl => apputils.Влево(за заднюю стенку.код, ТБЛ.код.Длина - 1))
.ToDictionary(ГРП =&ГТ; стеклопластик.Ключ, ГРП =&ГТ; стеклопластик.Рассчитывать());

Спасибо за ваше время и помощь.

BillWoodruff

Пожалуйста. Я добавил обновление к этому сообщению, чтобы показать, Как создать результат IEnumerable.

Priya-Kiko

Отмеченный. Спасибо снова.

Maciej Los

5ed!

BillWoodruff

Спасибо, Мацей