【问题标题】:ASP.net gridview sorting with linq result带有 linq 结果的 ASP.net gridview 排序
【发布时间】:2009-06-10 13:46:11
【问题描述】:

到目前为止,我有一个 linq 查询,它用过滤条件完美地填充了数据网格。 但是,当我尝试实现排序时,我失败了。

我有以下代码。它捕获了排序的开始。

protected void gvServers_Sorting(object sender, GridViewSortEventArgs e)
{
    if (e.SortDirection == SortDirection.Ascending)
    {
        SortDataAsc(e.SortExpression);
    }
    else if (e.SortDirection == SortDirection.Descending)
    {
        SortDataDesc(e.SortExpression);
    }
}

在这些子方法中,我想处理每个可能的排序表达式的排序。 但是,当我尝试使用 gridview 中已经存在的数据时,它不允许我使用 orderby 对其进行 linq

private void SortDataAsc(string p)
{
    var data = gvServers.DataSource;
    switch (p)
    {
        case "domain":
            var sorted = data.nothinghappenshere
        default:
            break;
    }
}

正如你所看到的,我无法对数据进行排序(可能是因为它是一个 var)。

我在网上看到的是,您可以像我在 SortDataAsc() 中尝试做的那样从 gridview 中获取数据,但它似乎不是那样工作的。

我只是想按我的结果集中的某个字段排序(在本例中是从连接派生的匿名类)

【问题讨论】:

    标签: c# asp.net linq linq-to-sql


    【解决方案1】:

    嗯,这是因为 DataSource 是弱类型的。

    如果您将其转换为 IEnumerable<YourDataType> 应该没问题。但是,请注意 OrderByOrderByDescending 不会就地排序 - 您必须对数据进行排序,然后重新分配 DataSource

    您说您的数据类型是匿名类型 - 恐怕您必须更改它。匿名类型只能(很容易)在单一方法中以强类型的方式使用 - 您不能稍后指定名称,因此您不能引用相同的属性等。

    不过,将匿名类型转换为命名类型并不难。 Here's an answer giving an example.

    【讨论】:

    • 正如我上面提到的,没有可以输入的数据类型。结果是一个连接,我使用 select new {} 来获得我需要的一切......
    • 抱歉,编辑忙。将尝试查找匿名类型问题。
    • 我也在考虑这个问题,但当时为此目的制作一个类型似乎有点过头了。我想这是能够排序的唯一出路......
    • 这是唯一不使用某种反射进行排序的方法,是的。 (嗯,有 一些奇怪的黑客方法可以有效地重用匿名类型,但它们很糟糕,我不会推荐它们。)
    • 你给我的链接建议我使用所有属性创建一个默认构造函数,我认为在使用对象初始化器时这不是必需的......
    猜你喜欢
    • 2023-03-28
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2017-12-27
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多