2016-06-24 40 views
1

我不是linq最棒的,但它是选择的语言。我正在尝试使用sql来编写查询。标准scenerio我有一张发票,发票上有发票细节。当加入表格时,具有多个细节的发票将重复。在标准的SQL中,我可以使用distinct或group by。我试图用linq跟踪,但得到错误,或者它只是不过滤掉它们。使用linq查询删除重复的行

这里是我的查询

var result = (from invoice in invoices 
     join invoiceItem in invItems on invoice.Id equals invoiceItem.InvoiceId 
     orderby invoice.InvoiceNo 
     select new InvoiceReceiveShipmentVM 
     { 
      dtInvoiced = invoice.dtInvoiced, 
      InvoiceNumber = invoice.InvoiceNo, 
      InvoiceType = invoice.InvoiceType, 
      InvoiceStatus = invoice.InvoiceStatus, 
      Lines = invoiceItem.Line, 
      Total = invoice.Total, 
      Carrier = invoice.Carrier, 
     }); 
return result.Distinct(); 

我也试过:

  var myList = result.GroupBy(x => x.InvoiceNumber) 
          .Select(g => g.First()).ToList(); 
     return myList.Skip(fetch.Skip).Take(fetch.Take).AsQueryable(); 
+3

你或许应该描述你希望过滤掉。例如也许显示你期望得到的结果,以及这个查询是什么(错误地?)给你。 – failedprogramming

回答

0

使用不同,请重载Equals和GetHashCode在InvoiceReceiveShipmentVM

public class InvoiceReceiveShipmentVM 
{ 
    public override bool Equals(object obj) 
    { 
     if (obj is InvoiceReceiveShipmentVM == false) return false; 

     var invoice = (InvoiceReceiveShipmentVM)obj; 
     return invoice.InvoiceNumber == InvoiceNumber 
      && invoice.InvoiceType == InvoiceType 
      && invoice.InvoiceStatus == InvoiceStatus 
      && invoice.Lines == Lines 
      && invoice.Total == Total 
      && invoice.Carrier == Carrier; 
    } 
    public override int GetHashCode() 
    { 
     return InvoiceNumber.GetHashCode() 
      ^InvoiceType.GetHashCode() 
      ^InvoiceStatus.GetHashCode() 
      ^Lines.GetHashCode() 
      ^Total.GetHashCode() 
      ^Carrier.GetHashCode(); 
    } 
}