在LINQ中避免重复

时间:2014-02-16 04:35:29

标签: c# linq

我有一个如下情景。实际上我得到了预期的结果。但需要避免在一个字段中重复。

我有一个自定义类来在我的报告中显示记录。类如下:

public class MyData
{
    public int ID;

    public string InvoiceNumber;

    public string DeliveryNoteNumber;

    public string QuotationNumber;
}

这里的流程是 1.报价详情 2.交货细节。单一交货单可以是多个报价单 3.发票明细。此处单张发票可以包含多个交货单。

因此,当我的发票报告显示我需要显示该发票的所有发货单时,需要以逗号分隔的标签显示。像所有报价一样,需要用逗号分隔显示。

我有一个问题。我在一份送货单中有多个报价单,并将该送货单添加到一张发票​​中。因此,在报告中,我可以用逗号分隔显示引用,但交付注释也是重复的。我使用Group Join对数据和代码进行分组,示例如下:

List<MyData> data = new List<MyData>();

MyData d1 = new MyData();
d1.ID = 1;
d1.InvoiceNumber = "Inv001";
d1.DeliveryNoteNumber = "DN001";
d1.QuotationNumber = "Q001";
data.Add(d1);

MyData d2 = new MyData();
d2.ID = 1;
d2.InvoiceNumber = "Inv001";
d2.DeliveryNoteNumber = "DN001";
d2.QuotationNumber = "Q002";
data.Add(d2);

var source = data.GroupBy(i => new { i.ID, i.InvoiceNumber })
       .Select(g => new MyData
       {
           ID = g.First().ID,
           InvoiceNumber = g.Key.InvoiceNumber,
           DeliveryNoteNumber = string.Join(", ", g.Select(i => i.DeliveryNoteNumber)),
           QuotationNumber = string.Join(", ", g.Select(i => i.QuotationNumber)),
       });

label1.Text = source.FirstOrDefault().DeliveryNoteNumber;
label2.Text = source.FirstOrDefault().QuotationNumber;

文本框中的输出如下:

Text1Result  = DN001, DN001
Text2Result  = Q001, Q002

这里首先是文本框问题。请提出解决此问题的想法。或者我需要更改存储过程以适应这种情况。我的自定义类(MyData)是从sp填充的(这里我只是硬编码)。使用与报价表,交货单表和发票表

的连接创建的sp

1 个答案:

答案 0 :(得分:2)

您可以使用LINQ中的Distinct()来避免重复。

var source = data.GroupBy(i => new { i.ID, i.InvoiceNumber })
           .Select(g => new MyData
           {
               ID = g.First().ID,
               InvoiceNumber = g.Key.InvoiceNumber,
               DeliveryNoteNumber = string.Join(", ", g.Select(i => i.DeliveryNoteNumber).Distinct()),
               QuotationNumber = string.Join(", ", g.Select(i => i.QuotationNumber).Distinct()),
           });