连接中的 Linq 计数和求和
Linq count and sum in join
我想像 SQL 命令 ... count(column1.table1) as countname, sum(column2.table1) as sumname ...
中那样获取带有计数列和总和列的行,但我不知道在 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();
大家知道正确的做法吗?
上面的评论正确地说应该使用 group by。
知道group by中应该使用什么键也很好。在上面的 select 中,您列出了很多属性,其中两个应该分组。请考虑添加和删除一些列。
为什么要删除列?因为性能。如果更多列用于对 id_jadwal
和 total_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()
这需要更多的性能。
我想像 SQL 命令 ... count(column1.table1) as countname, sum(column2.table1) as sumname ...
中那样获取带有计数列和总和列的行,但我不知道在 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();
大家知道正确的做法吗?
上面的评论正确地说应该使用 group by。
知道group by中应该使用什么键也很好。在上面的 select 中,您列出了很多属性,其中两个应该分组。请考虑添加和删除一些列。
为什么要删除列?因为性能。如果更多列用于对 id_jadwal
和 total_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()
这需要更多的性能。