c# - Aggregate objects using LINQ -
i have sql query count of blocks, grouping block name
var sql = @"select count(*) [count], o.name wish w left join objects o on o.id = w.[blockid] w.isdelete = 0 group o.name" var cmd = new sqlcommand(sql, connection); var reader = cmd.executereader(); label labelclear = (label)master.findcontrol("labelclear"); if (reader.hasrows) { while (reader.read()) { labelclear.text += reader["name"].tostring() + " - " + reader["count"].tostring() + "; "; } }
which make output string like:
"blockname1 - 15; blockname2 - 3; blockname3 - 28" etc.
(where 15, 3 , 28 - count of blockname1, blockname2 , blockname3).
and try convert query linq:
((label)master.findcontrol("labelclear")).text = db.wish.where(x => x.isdelete == 0) .groupby(x => x.objects_block.name) .select(g => new { name = g.key, cnt = sqlfunctions.stringconvert((decimal?)g.count()) }) .aggregate((a, b) => a.name + ": " + a.cnt + ", " + b.name + ": " + b.cnt );
but error on last line (with aggregate):
cannot implicitly convert type 'string' 'anonymoustype#2'
what correct way aggregate result string like
"blockname1 - 15; blockname2 - 3; blockname3 - 28"
try one:
((label)master.findcontrol("labelclear")).text = db.wish.where(x => x.isdelete == 0) .groupby(x => x.objects_block.name) .select(g => new { name = g.key, cnt = sqlfunctions.stringconvert((decimal?)g.count()) }) .asenumerable() .aggregate(string.empty, (a, b) => + ", " + b.name + ": " + b.cnt, s => s.substring(2));
explanation aggregate
parameters:
string.empty
- initial seed value(a, b) => + ", " + b.name + ":" + b.cnt
- aggregation function. concatenates current seed value new value string.s => s.substring(2)
- result selection function. removes first 2 characters, unnecessary,
asenumerable
necessary move string concatenation db application. ef not support aggregate
method parameters. count()
still performed db.
Comments
Post a Comment