场合
我有对象列表,我目前使用的linq查询是将每个项目计数两次。发生这种情况是因为数据以这种方式设置。每个采购订单编号都有两行,我在计算两者。我只需要数一个。
PO Number Pallets
123 5
123 5
234 8
234 8
345 2
345 2
Linq查询
Pallets = (from o in this.OrdersModel
where o.Pallets != null
select double.Parse(o.Pallets))
.Sum();
假设集合中的每个对象都是OrderModel,当运行此查询时,它将返回30(所有行都加起来)
期望的结果
托盘的正确数量为15个,每个PO托盘加一次。
相反,我想要的是一种选择不同的号码,然后加载托盘的方法。在直接SQL中添加这个条件会很容易,但我对如何在Linq中执行它有一点点想法。
问题
答案 0 :(得分:2)
试试这个:
Pallets = this.OrdersModel
.Where(x=>x.Paletts!=null).Distinct()
.Sum(x=>double.Parse(x.Pallets));
如果说here,您需要实现IEquatable
界面,这样您就可以定义哪些项目是重复的(感谢Raphaël提醒)
答案 1 :(得分:2)
是否有快速简便的方法来选择不同的
您可以使用GroupBy
:
Pallets = (from o in this.OrdersModel.GroupBy(o => o.PONumber).Select(g => g.First())
where o.Pallets != null
select double.Parse(o.Pallets))
.Sum();
但你可能应该尝试修复你的模型,这样你就不会在第一时间获得重复记录了!
答案 2 :(得分:0)
好吧,如果你想要一个快速的解决方案:托盘=托盘/ 2 但这是一个quck修复,你应该使用distinct。