Я не могу получить четкое указание из поиска Google по этому поводу. У меня есть таблица под названием transaction
, я хочу сгруппировать по BatchID
и упорядочить по descending
в отношении внешних ключей.
Определение таблицы
[TTransactionID] INT IDENTITY (1, 1) NOT NULL,
[BatchID] INT NULL,
[CardID] INT NULL,
[UserID] INT NULL,
[TransactionDateTime] DATETIME NOT NULL,
[TransactionStatus] VARCHAR (11) NOT NULL,
CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED ([TTransactionID] ASC),
CONSTRAINT [FK_Transactions_Cards] FOREIGN KEY ([CardID]) REFERENCES [dbo].[Cards] ([CardID]),
CONSTRAINT [FK_Transactions_Users] FOREIGN KEY ([UserID]) REFERENCES [dbo].[Users] ([UserID]) NOT FOR REPLICATION
Это код из моей пятой попытки
var TransactionList = db.Transactions
.GroupBy(x => new { x.BatchID })
.Select(x => x.ToList()).ToList();
int index = 0;
foreach (var item in TransactionList)
{
Response.Write( string.Format("[{0}] - {1}", index, item) );
index++;
}
Когда я запускаю приведенный выше код. В браузере появляется следующее сообщение. Я здесь застрял, что делать после этого, понятия не имею.
System.Collections.Generic.List`1[SECardDistribution.Models.Transaction]
пожалуйста, порекомендуйте Спасибо
Поскольку вы группируете результат в своем запросе LINQ, вам необходимо запустить два цикла - один для групп, а второй для данных в группе.
var TransactionList = db.Transactions
.GroupBy(x => new { x.BatchID })
.Select(x => x.ToList()).ToList();
foreach (var group in TransactionList)
{
foreach(var item in group)
{
// DO YOUR THINGS HERE...
}
}
foreach (var item in TransactionList.SelectMany(g => g)) {...}
// doing Select(x => x.ToList()) throws away group key!
var TransactionList = db.Transactions.GroupBy(x => x.BatchID).ToList();
foreach (var group in TransactionList)
{
// now group variable is a ... well, group of transactions. :)
// you can get its key and iterate over sub-collection of transactions in this group.
Response.Write($"Group {group.Key}:\n");
foreach (var item in group)
{
Response.Write($" Transaction {item.TTransactionID}\n");
}
}
На самом деле вы можете использовать SelectMany
var transactionList = db.Transactions.GroupBy(x => new { x.BatchID }).SelectMany(x => x).ToList();
Обратите внимание, что TransationList сортируется по возрастанию BatchId, а затем по убыванию CardId.
var TransactionList = context.Trx
.GroupBy(t => t.BatchId) //group by BatchId
.OrderBy(t => t.Key) //order by BatchId
.Select
(g =>
//Create a new "Batch Group" anonymously where each batch contains the associated transactions
new
{
BatchId = g.Key,
BatchTransactions = g.Select(trx => new { Card = trx.Card, User = trx.User }).OrderByDescending(batchTrx => batchTrx.Card.CardId), //order by CardId
}
);
Чтобы просмотреть отсортированный список, вы можете использовать вложенный цикл foreach следующим образом:
//Loop through the batch group in the sorted list
foreach(var batchGroup in TransactionList)
{
foreach(var batchTrx in batchGroup.BatchTransactions)
{
//You may access the properties of batchTrx like a normal object graph, example batchTrx.Card.CardId
}
}
foreach(var group in TransactionList) { foreach(var item in group) { ....