在datagridview中对IQueryable进行排序和筛选

本文关键字:排序 筛选 datagridview 中对 IQueryable | 更新日期: 2023-09-27 18:22:00

我使用linq对SQL进行了一个查询,结果将显示在带有排序和筛选选项的数据网格视图中。

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属性,这是更有效的方法吗?在我的函数中返回其他类型会更好吗?

欢迎任何建议

在datagridview中对IQueryable进行排序和筛选

您应该将返回类型从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);
    }
}
}