Контроль повторителя для агрегирования данных?

У меня есть стол с кабинетами врачей и врачами в тех кабинетах, которые я собираю для контроля за ретрансляторами. Возвращающиеся данные не агрегируются. Таким образом, если в 1 кабинете 2 врача, то есть 2 ряда, один офис, другой врач.

Есть ли способ агрегировать данные, чтобы ретранслятор показывал 1 кабинет со всеми врачами из этого офиса, чтобы я мог избежать дублирования?

15.12.2008 17:07:24
Просто чтобы прояснить, вы хотите показать Офисы с количеством доступных документов или что-то вроде office1 doc1 doc2 doc3 что-то в этом роде?
Perpetualcoder 15.12.2008 17:16:26
4 ОТВЕТА
РЕШЕНИЕ

В вашей разметке aspx:

<table><tr><th>Office</th><th>Doctors</th></tr>
<asp:repeater id="Repeater" runat="server" OnItemDataBound="NextItem" ... >
    <ItemTemplate><asp:Literal id="RepeaterRow" runat="server" />
    </ItemTemplate>
</asp:repeater>
<asp:Literal id="LastRow" runat="server" />
</table>

В вашем коде позади:

public class Office
{
    public string OfficeName {get;set;};
    List<string> _doctors = new List<string>();
    public List<string> Doctors {get{ return _doctors; } };

    void Clear()
    {
        OfficeName = "";
        _doctors.Clear();
    }

    public override string ToString()
    {
        StringBuilder result = new StringBuilder("<tr>");

        result.AppendFormat("<td>{0}</td>", OfficeName);

        string delimiter = "";
        result.Append("<td>");
        foreach(string doctor in Doctors)
        {
           result.Append(doctor).Append(delimiter);
           delimiter = "<br/>";
        }

        result.Append("</td></tr>");

        return result.ToString();
    }
}

,

private string CurOffice = "";
private Office CurRecord = new Office();

void NextItem(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;

    Literal repeaterRow = e.Item.FindControl("RepeaterRow") as Literal;
    if (repeaterRow == null) return;

    DataRow row = ((DataRowView)e.Item.DataItem).Row;

    if ( CurOffice != (string)row["Office"] )
    {
        repeaterRow.Text = CurRecord.ToString();
        repeaterRow.Visible = true;

        CurRecord.Clear();
        CurOffice = row["Office"];
        CurRecord.Office = CurOffice;
    }
    else
        e.Item.Visible = false;

    CurRecord.Doctors.Add((string)row["doctor"]);
}

void Page_PreRender(object sender, EventArgs e)
{
    LastRow.Text = CurRecord.ToString();
}
1
15.12.2008 18:09:51

Я думаю, что вам лучше всего выполнить агрегацию в базе данных.

0
15.12.2008 17:10:56

Я думал об этом, но подумал, что может быть более изощренный способ сделать это.

Если производится агрегация в БД, пропустите столбец с разделителями и проанализируйте его во время привязки данных?

0
15.12.2008 17:19:36

Используйте функцию объединения SQL

Начиная с SQLTeam.com:

DECLARE @EmployeeList varchar(100)

SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + 
       CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1

Это создаст разделенный запятыми список сотрудников. Вы можете сделать это для врачей тоже

0
11.09.2017 19:40:15