【问题标题】:Linq count and sum in join连接中的Linq计数和总和
【发布时间】:2020-12-06 19:36:13
【问题描述】:

我想在 SQL 命令... count(column1.table1) as countname, sum(column2.table1) as sumname ... 中获取包含 count 列和 sum 列的行,但我不知道在 Linq 中编写它的正确方法,例如:

    var get = (from dbrg in db.data_barangs
               join pbrg in db.pengiriman_barangs
               on dbrg.kode_barang equals pbrg.kode_barang
               join jdkp in db.jadwal_kapals
               on pbrg.id_jadwal equals jdkp.id_jadwal
               join dplb in db.data_pelabuhans
               on jdkp.kode_pelabuhan equals dplb.kode_pelabuhan
               join drdp in db.data_redpacks
               on dbrg.kode_barang equals drdp.kode_barang
               select new
               {
                   KodeBarang = dbrg.kode_barang,
                   TanggalKedatangan = jdkp.tgl_kedatangan,
                   WaktuKedatangan = jdkp.waktu_kedatangan,
                   NamaPelabuhan = dplb.nama_pelabuhan,
                   Kota = dplb.kota,
                   Provinsi = dplb.provinsi,
                   NamaKapal = jdkp.kapal,
                   JumlahPacking = drdp.id_jadwal.Count(),
                   TotalBerat = drdp.total_berat_packing.Sum()
                }).ToList();

你们知道正确的方法吗?

【问题讨论】:

  • 您是否要求在 LINQ to Entities 中替代 as 关键字?
  • 您需要在选择之前使用group by。
  • @ArsenKhachaturyan 是的,因为我在TotalBerat = drdp.total_berat_packing.Sum() 上收到了'int' does not contain a definition for 'Sum'
  • @WowoOt 我试过但得到错误异常,我很困惑
  • @robyiset "Wowo Ot" 建议是正确的,因为要在 LINQ 查询上使用聚合函数,您需要使用 GroupBy 方法。以this帖子为例。

标签: c# asp.net linq linq-to-sql


【解决方案1】:

上面的 cmets 正确地说应该使用 group by。


知道应该在 group by 中使用哪些键也很好。在上面的选择中,您列出了很多属性,其中两个应该分组。请考虑添加和删除一些列。 为什么要删除列?因为性能。如果更多的列用于对 id_jadwaltotal_berat_packing 进行分组,这在数据库级别会产生成本。

您可能会问为什么要添加更多列?这可能是因为正确的功能。现在你有七个经典属性,这些足够正确总结了吗?如果不添加更多列并为这些列创建索引


我确实修改了查询以完成分组,如果您有任何问题,请在评论部分告诉我。

var result = (from dbrg in db.data_barangs
           join pbrg in db.pengiriman_barangs
           on dbrg.kode_barang equals pbrg.kode_barang
           join jdkp in db.jadwal_kapals
           on pbrg.id_jadwal equals jdkp.id_jadwal
           join dplb in db.data_pelabuhans
           on jdkp.kode_pelabuhan equals dplb.kode_pelabuhan
           join drdp in db.data_redpacks
           on dbrg.kode_barang equals drdp.kode_barang
           group new { JumlahPacking = drdp.id_jadwal, TotalBerat = drdp.total_berat_packing }
           by new {
                KodeBarang = dbrg.kode_barang,
                TanggalKedatangan = jdkp.tgl_kedatangan,
                WaktuKedatangan = jdkp.waktu_kedatangan,
                NamaPelabuhan = dplb.nama_pelabuhan,
                Kota = dplb.kota,
                Provinsi = dplb.provinsi,
                NamaKapal = jdkp.kapal,
           }
           into beratAndPackingSumGroup
           select new
           {
               KodeBarang = beratAndPackingSumGroup.Key.KodeBarang,
               TanggalKedatangan = beratAndPackingSumGroup.Key.TanggalKedatangan,
               WaktuKedatangan = beratAndPackingSumGroup.Key.WaktuKedatangan,
               NamaPelabuhan = beratAndPackingSumGroup.Key.NamaPelabuhan,
               Kota = beratAndPackingSumGroup.Key.Kota,
               Provinsi = beratAndPackingSumGroup.Key.Provinsi,
               NamaKapal = beratAndPackingSumGroup.Key.NamaKapal,
               JumlahPacking = beratAndPackingSumGroup.Select(x => x.JumlahPacking).Count(),
               TotalBerat = beratAndPackingSumGroup.Sum(x => x.TotalBerat)
            });

如果JumlahPacking 属性不正确,您可以对其进行区分:beratAndPackingSumGroup.Select(x => x.JumlahPacking).Distinct().Count() 这需要更高的性能。

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2019-05-19
    • 2016-08-25
    • 1970-01-01
    • 2017-11-08
    • 2010-10-16
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多