回答

收藏

按总和Linq分组到C#中的SQL

技术问答 技术问答 217 人阅读 | 0 人回复 | 2023-09-14

确实对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();
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则