[英]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.