在datagridview中对IQueryable进行排序和过滤

时间:2012-01-30 21:07:30

标签: c# linq iqueryable

我使用linq to SQL进行查询,结果将显示在带有排序和过滤选项的datagridview中。

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 个答案:

答案 0 :(得分:1)

您应该将返回类型从IQueryable更改为IEnumerable<dynamic>,然后您可以执行以下操作:

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

我认为您也可以这样编码(但我通常不会使用from,所以我不确定)

 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);
    }
}

}