努力与linq查询不同的结果

时间:2012-12-17 16:28:46

标签: c# asp.net linq object

我有发票行对象列表。

我想显示一份独特的发票清单,以便稍后我可以显示所选不同发票的发票行。

    List<Invoice> returnInvoices = (List<Invoice>)Session["Invoices"];
    var uniqueInvoices = from i in returnInvoices
                           select new
                           {
                               i.InvoiceNo,
                               i.InvoiceDate,
                               i.OrderNo,
                               i.CustomerPO,
                           };
    GridView3.DataSource = uniqueInvoices;
    GridView3.DataBind();

如何在InvoiceNo上返回唯一结果?我真的很想弄清楚这个:(

2 个答案:

答案 0 :(得分:4)

真的,你不应该担心从会话变量中获取不同的发票 - 你应该担心为什么首先会有重复的发票。您在什么时候向会话变量添加发票而不检查是否已存在?

也就是说,您可以为每个ID选择一张发票,如下所示:

var nonUniqueInvoices = from i in returnInvoices
                       select new
                       {
                           i.InvoiceNo,
                           i.InvoiceDate,
                           i.OrderNo,
                           i.CustomerPO,
                       }; // as before
var uniqueInvoices = nonUniqueInvoices
    .GroupBy(i => i.InvoiceNo)
    .Select(g => g.First());
GridView3.Datasource = uniqueInvoices; // as before

这只会在列表中找到的每个ID中选择第一个发票;这可能不是最新的副本。


如果需要ID,而不是每个ID的一项,则可以使用

var uniqueInvoiceIDs = returnInvoices.Select(i => i.InvoiceNo).Distinct();

应该更有效率。

答案 1 :(得分:0)

Enumerable.Distinct构建EqualityComparer<Invoice>的自定义:

public class InvoiceComparer : IEqualityComparer<Invoice>
{
    public bool Equals(Invoice x, Invoice y)
    {
        if (x == null || y == null) return false;
        return x.InvoiceNo == y.InvoiceNo;
    }

    public int GetHashCode(Invoice obj)
    {
        if (obj == null) return int.MinValue;

        return obj.InvoiceNo.GetHashCode();
    }
}

然后,您可以使用Distinct和自定义比较器来获得结果:

List<Invoice> invoices = (List<Invoice>)Session["Invoices"];
IEnumerable<Invoice> uniqueInvoices = invoices.Distinct(new InvoiceComparer());