2012-02-04 45 views
1

我想弄清楚如何使用Linq执行子选择。我有一个带有“借记”和“贷记”栏的Excel表。我需要筛选出任何有借方列值(> 0.00)的行,并与进一步向下的贷方列值相匹配。两行都必须具有相同的付款人ID。以下是我想出迄今:使用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. 

      } 
     } 
    } 

我希望有一种方法更优雅的解决方案由标准来选择Excel行上面,而不是通过他们循环各一次。我不认为我以任何方式在这里使用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 2012-02-05 10:55:40

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 2012-02-04 17:25:20

+0

Ack,我的不好。只是给出了一个通用的LINQ答案 - 我在看到你的问题之前根本不知道LinqToExcel的存在。 – eliah 2012-02-04 18:09:49

+0

很酷。我想我需要尝试另一个库,并使用你的例子:) – backdesk 2012-02-04 18:12:01