簡體   English   中英

努力與linq查詢以獲得不同的結果

[英]struggling with linq query for distinct results

我有一個發票行對象列表。

我想顯示唯一發票的列表,以便以后可以顯示所選不同發票的發票行。

    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上返回唯一結果? 我真的很努力去解決這個問題:(

確實,您不必擔心會從會話變量中獲得不同的發票-您應該擔心為什么首先要在其中重復。 在什么時候將發票添加到會話變量而不檢查是否已經有發票?

也就是說,您可以按以下步驟為每個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();

這應該更有效。

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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM