使用linq选择不同的结果

时间:2013-12-18 13:57:25

标签: c# linq linq-to-objects

场合

我有对象列表,我目前使用的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中执行它有一点点想法。

问题

  1. 是否有使用Linq快速简便的方法来选择不同的号码?
  2. 如果没有,那么最好的方法是什么?

3 个答案:

答案 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。