【问题标题】:select distinct results using linq [duplicate]使用 linq 选择不同的结果 [重复]
【发布时间】:2013-12-18 13:57:25
【问题描述】:

情况

我有对象列表,我当前使用的 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 托盘加起来一次。

相反,我想做的是选择不同的 po 编号,然后将托盘相加。在直接 SQL 中添加这个条件会很容易,但我对如何在 Linq 中做到这一点有一点想法。

问题

  1. 有没有一种快速简便的方法可以使用 Linq 选择不同的 PO 编号?
  2. 如果不是,那么完成此类事情的最佳方法是什么?

【问题讨论】:

  • 你的意思是不同的吗?虽然我使用 lambda 形式,但有一个名为 Distinct() 的 linq 方法,所以我很难就您的查询提出建议
  • 如果每个 PO 编号有两个条目,您怎么知道要在总和中包含两个条目?
  • 好吧,如果你想要一个快速的解决方案:Pallets = Pallets /2;
  • @IanNelson 有几种方法,但最初我们还没有需要担心的数据结构。

标签: c# linq linq-to-objects


【解决方案1】:

有没有一种快速简便的方法来选择不同的

你可以使用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();

但您可能应该尝试修复您的模型,以免一开始就出现重复记录!

【讨论】:

  • @D Stanley 这绝对是最好的方法。我们还没有完全弄清楚这一步。但我们最终需要不填充每条记录。感谢您的回答
【解决方案2】:

试试这个:

Pallets = this.OrdersModel
                .Where(x=>x.Paletts!=null).Distinct()
                .Sum(x=>double.Parse(x.Pallets));

正如here所说,你需要实现IEquatable接口,这样你就可以定义哪些项目是重复的(感谢Raphaël的提醒)

【讨论】:

【解决方案3】:

好吧,如果您想要一个快速的解决方案:托盘 = 托盘 /2 但这是一个快速修复,你应该使用 distinct。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多