2012-01-30 92 views
0

我有一個查詢使用linq到SQL,其結果將顯示在排序和過濾選項的datagridview。在datagridview中排序和過濾IQueryable

public IQueryable RegresaDepositosBancarios() 
     { 
      var depositos = from d in context.depositos_bancarios 
          where d.Aplicado == false 
          orderby d.FechaDeposito ascending 
          select new 
          { 
           d.IDDeposito, 
           d.cuentas_bancarias.Nombre, 
           d.Monto, 
           d.FechaDeposito, 
           d.Observaciones 
          }; 
      return depositos ; 
     } 

後來在我的代碼中,我將數據源設置爲使用以前的結果。

var depositos = operaciones.RegresaDepositosBancarios(); 
dataGrid_depositos.DataSource = depositos; 

正如您所看到的,我正在返回並且匿名類型爲IQueryable,而且我無法對此進行排序或篩選。我讀過,你可以實現一個自定義的函數來將IQueryable轉換爲DataView,然後使用RowFilter屬性,這樣做更有效嗎?可以更好地返回其他類型在我的功能?

任何建議,歡迎

+1

http://stackoverflow.com/questions/487870/allow-user-to-sort-columns-from-a-linq-query-in-a-datagridview – 2012-01-30 21:13:27

+0

所以該方法(在鏈接描述給定)你認爲在我的情況下更合適嗎? SortableBindingList或將結果轉換爲DataTable? – 2012-01-30 22:58:03

+0

我必須承認,我從來沒有使用DataGridView作爲DataSource的LINQ。但是這兩種方法似乎都有優點和缺點,其中一種可能更快並且類型安全,另一種方法更慢(使用反射),但更容易維護。 – 2012-01-30 23:09:29

回答

1

你應該返回類型從IQueryable更改爲IEnumerable<dynamic>,那麼你可以這樣做:

var over100 = RegresaDepositosBancarios() 
    .Where(d => d.Monto > 100); 

我想你也能編寫這種方式(不過我不所以我不確定)

var over100 = from d in RegresaDepositosBancarios() 
    where d.Montho > 100; 

這裏是一個測試程序。

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ClassLibrary1 
{ 
public class Class1 
{ 
    public int A; 
    public int B; 
} 

public class Test 
{ 
    public static IEnumerable<dynamic> Build() 
    { 
     var list = new List<Class1>(); 
     list.Add(new Class1() { A = 10, B = 100 }); 
     list.Add(new Class1() { A = 200, B = 2000 }); 

     return list 
      .OrderBy(e => e.B) 
      .Select(e => new { A1 = e.A, B2 = e.B }); 
    } 

    public static IEnumerable<dynamic> Filter() 
    { 
     return Build() 
      .Where(e => e.A1 > 100); 
    } 

    static void Main() 
    { 
     foreach (dynamic e in Filter()) 
      Console.WriteLine("A1={0}, B2={1}", e.A1, e.B2); 
    } 
} 

} 
+0

我的答案如下:「表達式樹可能不包含動態操作」 – 2012-01-30 22:55:48

+0

對不起,我的錯是因爲沒有測試。將'IQueryable '更改爲'IEnumerable '。我已經爲答案添加了一個測試程序。 – 2012-01-30 23:15:42

+0

經過一番研究,我認爲你的代碼不適用於我的特殊情況,因爲它使用IEnumerable,而且我的研究表明在查詢數據庫時最好使用IQueryable。你認爲使用通用清單是個好主意嗎? – 2012-01-31 01:38:20