[英]Add an additional value from LINQ
我有以下代碼:
var checkRegisters = await Database.Client.Context.CheckRegister
.Where(cr => cr.CheckingAccount == account
&& cr.CheckDate >= fromDate
&& cr.CheckDate <= toDate
&& cr.Void == "N" )
.GroupBy(cr => cr.CheckNumber,
cr => cr.Amount, (key, g) =>
new {
CheckNumber = key,
Amount = g.Sum()
})
.OrderBy(c => c.CheckNumber)
.ToListAsync();
除了向我返回CheckNumber和Amount的列表之外,我還不太了解它在做什么。 CheckRegister表包含“收款人”列,EF中的相應modelBuilder也是如此:
entity.Property(e => e.Payee).HasColumnType("varchar(255)");
如何將“收款人”添加到返回的列表中?
代碼的作用是:
您的數據庫有一個包含CheckRegisters
的表。 每個CheckRegister
至少具有屬性CheckingAccount
, CheckDate
, Void
, CheckNumber
和Amount
,並且根據您的情況,還具有一個Payee
屬性:
因此,您的代碼將逐步描述。
// Take the complete table of CheckRegisters:
Database.Client.Context.CheckRegister
// from every checkRegister in this table (every row),
// keep only those checkRegisters that have a CheckingAccount value equal to account
// and a CheckDate value betwen fromData and toDate
// and a value for property Void equalt to "N"
.Where(checkRegister => checkRegister.CheckingAccount == account
&& checkRegister.CheckDate >= fromDate
&& checkRegister.CheckDate <= toDate
&& checkRegister.Void == "N" )
// Group all remaining CheckRegisters into groups with same checkNumber
// Each group will have a property Key which has the value of the common CheckNumber
.GroupBy(cr => cr.CheckNumber,
// ElementSelector: from every CheckRegister put only the amount in each grouop
checkRegister => checkRegister.Amount,
// ResultSelector: take every key (which we call checkNumber)
// and all Amounts of all CheckRegisters with this CheckNumber
// to make one new object:
(checkNumber, amountsFromCheckRegistersWithThisCheckNumber) => new
{
CheckNumber = key,
// To calculate property Amount: sum all amountsFromCheckRegistersWithThisCheckNumber
Amount = amountsFromCheckRegistersWithThisCheckNumber.Sum(),
})
// By now you have a sequence of objects, each with two properties:
// CheckNumber: a checkNumber used in the CheckRegisters that were left after the Where
// Amount: the sum of all Amounts of all CheckRegisters that have this CheckNumber
// Finally you do some Ordering, and convert the resulting elements into a list
.OrderBy(groupedItem => groupedItem.CheckNumber)
.ToListAsync();
現在,您需要進行更改:添加Payees
。
問題是,返回的數據是按CheckNumber分組的CheckRegisters。 每個收款人都是每個CheckRegister。 如果將具有相同CheckNumber的CheckRegisters組組成,則具有此CheckNumber的幾位收款人:
CheckNumber | Payee | ...
1 | A
2 | B
1 | C
2 | C // note: C is used again
1 | D
如果我使用相同的CheckNumber進行分組,您將獲得:
group CheckNumber 1 [1, A], [1,C], [1,D]
group CheckNumber 2 [2, B], [2,C]
因此,每個組可能有不止一個員工。 如果可以的話,只需省略ElementSelector並在ResultSelector中選擇雇員
var result = Database.Client.Context.CheckRegister
.Where(...)
.GroupBy(cr => cr.CheckNumber,
// ResultSelector: take every key (which we call checkNumber)
// and all CheckRegisters with this CheckNumber
// to make one new object:
(checkNumber, checkRegistersWithThisCheckNumber) => new
{
CheckNumber = checkNumber,
// for Employees: Select property Employee, and convert them to a List
Employees = checkRegistersWithThisCheckNumber
.Select(checkRegister => checkRegister.Employee)
.ToList(),
// Amounts: select the Amounts and Sum
Amount = checkRegistersWithThisCheckNumber
.Select(checkRegister => checkRegister.Amount)
.Sum(),
});
我會將其添加到您在GroupBy中創建的對象中。 所以像下面這樣改變第3行
.GroupBy(cr => cr.CheckNumber, cr => cr.Amount, cr => cr.Payee, (key, g) =>
new { CheckNumber = key, Amount = g.Sum(), Payee = g.Payee})
請注意,分組依據只是按數字和金額分隔,因此,如果您也按收款人分組,則應該預期結果列表會更長。 這也假設收款人是表中列的名稱。
通過以下方式將新列添加到組中:
var checkRegisters = await Database.Client.Context.CheckRegister
.Where(cr => cr.CheckingAccount == account && cr.CheckDate >= fromDate && cr.CheckDate <= toDate && cr.Void == "N" )
.GroupBy(cr => cr.CheckNumber, cr => cr.Amount, e => e.Payee , (key, g, p) => new { CheckNumber = key, Amount = g.Sum(), Payee = p})
.OrderBy(c => c.CheckNumber).ToListAsync();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.