【问题标题】:Sort and filter IQueryable in datagridview在 datagridview 中对 IQueryable 进行排序和过滤
【发布时间】:2012-01-30 21:07:29
【问题描述】:

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

欢迎提出建议

【问题讨论】:

  • 那么您认为哪种方法(在给出的链接中描述)更适合我的情况? SortableBindingList 或将结果转换为 DataTable?
  • 我必须承认我从来没有使用过带有 LINQ 的 DataGridView 作为数据源。但这两种方法似乎各有利弊,一种可能更快且类型安全,另一种可能较慢(使用反射)但更易于维护。

标签: c# linq iqueryable


【解决方案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);
    }
}

}

【讨论】:

  • 您的回答如下:“表达式树可能不包含动态操作”
  • 抱歉我没有测试。将 IQueryable&lt;dynamic&gt; 更改为 `IEnumerable'。我在答案中添加了一个测试程序。
  • 经过一些研究,我认为您的代码不适合我的特定情况,因为它使用 IEnumerable 并且我的研究表明在查询数据库时最好使用 IQueryable。您认为使用通用列表 是个好主意吗?
  • 是的,List 是一个更好的方法。但是,您的问题是关于使用匿名类而不是关于最佳实践或 IEnumerable 与 IQueryable。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 2010-09-27
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多