2015-03-26 3 views
-1
var supervisorSummary = Persons.GroupBy(p => p.SupervisorName) 
           .Select(group => new { Name = group.Key, 
                 Count = group.Count() }) 
           .OrderBy(x => x.Name).ToList(); 

Этот запрос возвращает имя и счет отлично. Я привязал этот вывод к GridView и выполнил Сортировку по обоим столбцам. Затем я понял, что граф рассматривается как String вместо Integer в GridView.Группа Linq по возврату anonymous

Есть ли способ указать тип данных для BoundField в Gridview здесь?

<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; } } 
+6

[Count] (https://msdn.microsoft.com/en-us/library/vstudio/bb338038%28v=vs. 100% 29.aspx) всегда возвращает значение int. Что дало вам понять, что 'Count' является значением' text'? –

+0

Вы уверены, что не просто создали графу графа как строку вместо целого? – Hozikimaru

+0

Это моя ошибка, она возвращает int. Кажется, что-то с GridView обрабатывает все данные как String. Есть идеи? – techspider

ответ

0

Кажется, я перепутал вопрос. На самом деле это не проблема с Linq или Gridview.

Это проблема в моем преобразовании DataTable.

У меня был код ниже, чтобы создать столбец без указания типа данных.

dataTable.Columns.Add(prop.Name); 

Я изменил его ниже, и она отлично работает

dataTable.Columns.Add(prop.Name, prop.PropertyType); 
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

Давая ему имя, ничего не меняет. – Servy

+0

добавлено больше кода, чтобы дать точную проблему; – techspider

0

Count() всегда возвращает значение int. Таким образом, тип возвращаемого объекта внутри запроса Linq также будет иметь тип int.

Пожалуйста, проверьте тип привязки GridView и тип данных столбца.

Но есть еще способ указать тип внутри запроса, по типу casting. Для информации:

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

С этим типом графа будет долго (вместо междунар).. Однако вы не можете применять этот тип приведения из строки в int.

Просьба указать код привязки к сетке.

+0

добавлено больше кода, чтобы дать точную проблему; – techspider

Смежные вопросы