2012-02-04 2 views
1

Я пытаюсь выяснить, как выполнить подвыбор с использованием Linq. У меня есть лист excel с дебетом и столбцом «кредит». Мне нужно отфильтровать любые строки, у которых есть значение столбца дебета (> 0.00), которое больше соответствует значению столбца кредита. Обе строки должны иметь одинаковый идентификатор плательщика. Вот что я придумал до сих пор:Sub-Select Использование LinqToExcel

public void balanceSheet() 
    { 
     foreach (Payment payment in this.payments) 
     { 
      // c[6] is the payers ID. 
      var debits = from c in this.test.WorksheetNoHeader() 
         where c[6] != "0" && c[13] != "0.00" 
         select c; 
      // Find any rows in the sheet that have the same payer id AND the debit 
      // amount from the query above in it's credit column. 
      foreach(LinqToExcel.RowNoHeader debit in debits) 
      { 
       var credits = from c in this.test.WorksheetNoHeader() 
           where c[6] == debit[6] && c[15] == debit[13] 
           select c; 

       // Do something awesome if it finds something. 

      } 
     } 
    } 

Я надеюсь, что есть способ более элегантное решение для выбора строк первенствовать по критериям выше, чем цикл через них каждый раз. Я не думаю, что я использую LINQ для его полного потенциала здесь любыми способами. Есть идеи?

ответ

1

LinqToExcel не поддерживает соединения, но вы можете преобразовать его в список в памяти, а затем выполнить объединение

var credits = from credit in this.test.WorksheetNoHeader().ToList() 
    join debit in this.test.WorksheetNoHeader().ToList() on credit[6] equals debit[6] 
    where debit[13] != "0.00" 
    where debit[13] == credit[15] 
    select credit 
+0

Я бы тоже предложил это (как было сказано выше), но, возможно, вам следует определить дополнительную переменную для списка, а затем выполнить соединение, поскольку это может сохранить как память, так и время обработки. – jCoder

1

Попробуйте присоединиться:

var credits = from credit in this.test.WorksheetNoHeader() 
    join debit in this.test.WorksheetNoHeader() on credit[6] equals debit[6] 
    where debit[13] != "0.00" 
    where debit[13] == credit[15] 
    select credit 

Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/bb311040.aspx

+0

LinqToExcel не поддерживает соединение :( – backdesk

+0

Ack, мой плохой. Просто дал общий ответ LINQ - я даже не знал, что LinqToExcel существует, прежде чем вы видите свой вопрос. – eliah

+0

Это круто. Я думаю, мне нужно попробовать другую библиотеку и использовать ваш пример :) – backdesk