Linq集团通过匿名返回

时间:2015-03-26 17:10:28

标签: c# .net linq gridview

var supervisorSummary = Persons.GroupBy(p => p.SupervisorName)
                               .Select(group => new { Name = group.Key, 
                                                      Count = group.Count() })
                               .OrderBy(x => x.Name).ToList();

此查询完美返回Name和Count。我将此输出绑定到GridView并在两列上实现了排序。然后我意识到Count在GridView中被视为String而不是Integer。

有没有办法在Gridview中为BoundField指定数据类型?

 <asp:GridView ID="gvSupervisorSummary" runat="server" AutoGenerateColumns="False" EnableViewState="False" AllowSorting="true" OnSorting="gvSupervisorSummary_Sorting"
            BackColor="White" BorderColor="#cccccc" BorderStyle="None" BorderWidth="1px" CellPadding="2"
            EmptyDataText="No person found." GridLines="none" Width="100%">
            <AlternatingRowStyle BackColor="#ededed" />
            <Columns>
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:BoundField DataField="Count" HeaderText="Direct Reports Count" SortExpression="Count"/>
            </Columns>

我转换为DataView并绑定到网格,以使我的排序更具动态性。

 DataView dv = new DataView(DataManager.ToDataTable(supervisorSummary));
            dv.Sort = SortExpression;
gvSupervisorSummary.DataSource = dv;
            gvSupervisorSummary.DataBind();

我的排序表达式定义为

private string SortExpression { get { if (Session["SCSortExpression"] == null) Session["SCSortExpression"] = "Count ASC"; return Session["SCSortExpression"].ToString(); } set { Session["SCSortExpression"] = value; } }

3 个答案:

答案 0 :(得分:0)

这里没有任何动态。匿名类型不是动态对象。这是一个强类型的对象,你没有给出一个名字。编译器只是推断出类型并为你创建它,但你不能用这种类型做任何动态的事情。

如果要命名返回的类型,可以执行此操作,但不会更改GridView正在执行的操作。

class MyGroup {
    public string Name { get; set; }
    public int Count { get; set; }
}

var supervisorSummary = Persons.GroupBy(p => p.SupervisorName)
                           .Select(group => new MyGroup { Name = group.Key, 
                                                  Count = group.Count() })
                           .OrderBy(x => x.Name).ToList();

虽然这似乎不是真正的问题。你不期待GridView做什么?

答案 1 :(得分:0)

Count()始终返回int值。因此,Linq查询中的Return对象的类型也将是int类型。

请检查GridView绑定和列数据类型。

但是,仍然有一种方法可以通过类型转换来指定查询中的类型。 供您参考:

var supervisorSummary = Persons.GroupBy(p => p.SupervisorName)
                                   .Select(group => new
                                   {
                                       Name = group.Key,
                                       Count =(Int64)group.Count(),                                   
                                   })
                                   .OrderBy(x => x.Name).ToList();

这样,Count的类型将很长。(而不是int)。 但是,您不能将此类型转换从string应用于int。

请提供您的网格视图绑定代码。

答案 2 :(得分:0)

似乎我搞砸了这个问题。实际上,它不是Linq或Gridview的问题。

这是我的DataTable转换中的问题。

我有以下代码来创建列而不指定数据类型。

dataTable.Columns.Add(prop.Name);

我把它改成了下面,它工作正常

dataTable.Columns.Add(prop.Name, prop.PropertyType);