C# 在datagridview中排序和筛选IQueryable

C# 在datagridview中排序和筛选IQueryable,c#,linq,iqueryable,C#,Linq,Iqueryable,我使用LINQtoSQL进行了一个查询,结果将显示在带有排序和筛选选项的datagridview中 public IQueryable RegresaDepositosBancarios() { var depositos = from d in context.depositos_bancarios where d.Aplicado == false

我使用LINQtoSQL进行了一个查询,结果将显示在带有排序和筛选选项的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属性,这是更有效的方法吗?在我的函数中返回其他类型会更好吗


欢迎任何建议

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

 var over100 = RegresaDepositosBancarios()
    .Where(d => d.Monto > 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);
    }
}

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间类库1
{
公共班级1
{
公共INTA;
公共int B;
}
公开课考试
{
公共静态IEnumerable Build()
{
var list=新列表();
Add(新的Class1(){A=10,B=100});
Add(新的Class1(){A=200,B=2000});
返回列表
.OrderBy(e=>e.B)
.Select(e=>new{A1=e.A,B2=e.B});
}
公共静态IEnumerable筛选器()
{
返回构建()
.式中(e=>e.A1>100);
}
静态void Main()
{
foreach(过滤器()中的动态e)
WriteLine(“A1={0},B2={1}”,e.A1,e.B2);
}
}
}

那么您认为哪种方法(在给出的链接中描述)更适合我的情况?SortableBindingList还是将结果转换为DataTable?我必须承认,我从未使用过带有LINQ的DataGridView作为数据源。但这两种方法似乎都有利弊,一种可能更快且类型安全,另一种可能更慢(使用反射),但更易于维护。我从您的回答中得出以下结论:“表达式树可能不包含动态操作”抱歉,我没有测试。将
IQueryable
更改为“IEnumerable”。我在答案中添加了一个测试程序。经过一些研究,我认为您的代码不适合我的特定情况,因为它使用IEnumerable,我的研究表明,在查询数据库时最好使用IQueryable。你认为使用通用列表是一个好主意吗?是的,列表是一个更好的方法。然而,您的问题是关于使用匿名类,而不是关于最佳实践或IEnumerable vs IQueryable的。
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);
    }
}

}