|
确实对Linq进行SQL分组和求和非常困难,已经在所有地方进行了搜索,但是我不太了解如何将其他解决方案应用于我自己的解决方案。
- G% M: z! g+ ~7 n我的数据库中有一个名为view_ProjectTimeSummary的视图,该视图具有以下字段:
1 N! Q9 R$ d/ nstring_UserDescription& N$ q) h% M* Q( L5 h5 D9 W$ W1 x
string_ProjectDescription9 f, x; E/ Y7 j) ]* \5 ?/ o
datetime_Date0 k( w: |" x4 I. P, Y
double_Hours. b( `! w+ Z2 K. Q
我有一个方法,该方法接受to和from日期参数,并首先创建此List :5 C$ k! g* \6 W! b
List view_UserTimeSummaryToReturn = ' T6 C4 u- ^0 f
(from linqtable_UserTimeSummaryView
& @5 d& r+ f1 Y1 V/ q3 S in datacontext_UserTimeSummary.GetTable()
7 U, [: k! x9 w) H$ ~3 O4 U$ X3 U' U where linqtable_UserTimeSummaryView.datetime_Week = datetime_From
/ j8 H8 C3 K4 P% b( b select linqtable_UserTimeSummaryView).ToList();
& O; b- N5 i" d+ w% d1 M$ P1 _2 T返回列表(用作datagridview的数据源)之前,我使用相同名称的参数过滤string_UserDescription字段:
0 P+ Z: K7 ^$ {( Tif (string_UserDescription != "")
4 o' \* s! P$ E {3 i. H! v N& |# w3 b7 ^: f
view_UserTimeSummaryToReturn =
. q/ g" Y* }9 w3 p/ ?, c0 B Y (from c in view_UserTimeSummaryToReturn ]. `; \/ @! ?1 b" a, @' p
where c.string_UserDescription == string_UserDescription
* O& G) x5 n V: ~1 D select c).ToList();
$ `8 N$ c2 H Z( V4 I }
) J2 Z0 X0 i- T6 \# l N- s# |) Creturn view_UserTimeSummaryToReturn;' v8 [' W' Z' Z4 H, q1 {( C
如何处理结果List 以显示该用户和项目的to和from日期参数之间的double_Hours字段的 总和 (而不是每个日期的单独条目)?
* m) a- i4 Y8 S, _9 V: C3 _例如具有以下字段的Lis??t :2 l+ y, k, D1 t
string_UserDescription9 @) x3 t4 j# [2 C O
string_ProjectDescription
/ l; v6 _5 _! e9 w1 y2 hdouble_SumOfHoursBetweenToAndFromDate
0 m4 U8 o: b4 Q' d8 |4 u! Z我是对的意思,这意味着我将不得不返回不同类型的List (因为它的字段少于view_UserTimeSummary)?
0 m# i+ W& a P7 c我读过要得到总和,就像是’group / by / into b’,但是通过查看其他解决方案不了解该语法的工作原理。有人可以帮助我吗?' c+ P2 N L. f4 D, w3 N/ X
谢谢史蒂夫- K ?: k- S/ q- I8 c' G, i
v2 m5 m4 I1 d+ R0 r解决方案:
0 |' J1 u5 b+ r( f
1 m5 X% J& A( O3 U
, p0 Z1 `5 v6 l+ {6 @
7 o6 o5 |) l' l; T/ m 首先定义一个类来保存结果:
) z$ O H; h2 r& gpublic class GroupedRow2 ^' t9 p! Y# b
{! x, W; A# b, T& ?
public string UserDescription {get;set;}6 U7 t. {1 Q0 {; F! b
public string ProjectDescription {get;set;}
( u) d* E9 @ H$ x7 J public double SumOfHoursBetweenToAndFromDate {get;set;}; w5 i1 s$ |! b3 E }# z8 V
}
% e3 j* B! X$ ~7 t% z4 u& g由于您已经应用了过滤,因此剩下要做的就是分组。
% P' D; r4 k$ A/ m% D, BList result =" r8 |* Z4 a* Q
(/ o& ~ n/ l* c2 x. f: A b
from row in source' r+ [ K1 o5 q/ G" V& G) d- K: {6 O# i
group row by new { row.UserDescription, row.ProjectDescription } into g0 r* n$ K2 K: u! Z. a* s; k- G6 b
select new GroupedRow()+ @, R. O5 [% d$ c! \3 {' P
{: [ ]& O" o& c \4 h; M2 _
UserDescription = g.Key.UserDescription,! ?; B" R9 }$ c$ y6 W. i2 F9 j( c
ProjectDescription = g.Key.ProjectDescription,6 H& @0 F0 _) {/ j# _
SumOfHoursBetweenToAndFromDate = g.Sum(x => x.Hours) Q: z% `9 A+ U$ j+ u
}
8 p5 W, L7 F% u# N# `).ToList();* W7 ^3 s, d" x4 ~! _6 X$ Q' _. v- u
(或其他语法)
5 v% Z1 l# a R! y' q) X7 D7 N* @List result = source- Y( r# i& p1 D& T. J
.GroupBy(row => new {row.UserDescription, row.ProjectDescription })3 D* d& p' C. D5 d% j& I
.Select(g => new GroupedRow()
9 s7 l4 J7 t- G+ R {
$ b' O6 a+ c9 a6 |# `- B5 g. A UserDescription = g.Key.UserDescription,
]& ?8 |6 V" |% c0 c' j! z4 X ProjectDescription = g.Key.ProjectDescription,! d; h" z2 \$ I
SumOfHoursBetweenToAndFromDate = g.Sum(x => x.Hours), f' G* e/ s1 @! P. l' H* ]
})
$ N. B' W5 n$ l .ToList(); |
|