使用LINQ查询对内部中继器进行排序

时间:2013-03-28 13:34:03

标签: c# asp.net linq asprepeater

我正在尝试列出一组关联,每个关联中都有一个分配给关联的“窗口小部件”。该列表将包括关联名称和分配给它的任何小部件。问题是内部窗口小部件列表需要按DisplaySequence进行排序。

以下EDMX模型: EDMX Model

简化的中继器标记

<asp:Repeater ID="rptAssociations" runat="server">
    <ItemTemplate>      
        <div data-type="assn" id="<%# ((Association)Container.DataItem).AssociationID %>">
            <h3 style="margin-top:15px;"><%# ((Association)Container.DataItem).Acronym %> - <%# ((Association)Container.DataItem).Name %></h3> 
            <asp:Repeater runat="server" ID="rptWidgets" DataSource="<%# ((Association)Container.DataItem).AssociationWidgets %>" >
                <HeaderTemplate>                
                    <ul class="WidgetList">
                </HeaderTemplate>
                <ItemTemplate>
                    <li id="<%# ((AssociationWidget)Container.DataItem).DisplaySequence %>"><%# ((AssociationWidget)Container.DataItem).Widget.Name %></li>
                </ItemTemplate>
                <FooterTemplate>
                    </ul>
                </FooterTemplate>
            </asp:Repeater>
        </div>      
    </ItemTemplate>
</asp:Repeater>

当前查询

var associations = (from a in 
    context.Associations.Include("AssociationWidgets")
                        .Include("AssociationWidgets.Widget")
    orderby a.Acronym
    select a).ToList();

rptAssociations.DataSource = associations;
rptAssociations.DataBind();

我目前能够通过我现在的设置获取我正在寻找的数据。我正在寻找获得相同数据的最有效方法,但是,按正确的显示顺序列出小部件。

我应该采用不同的linq查询方法吗?

1 个答案:

答案 0 :(得分:3)

我会这样做(未经测试):

var associations = 
    context.Associations.Select( a => 
       new {
          //... specific properties you need 
          AssociationId = a.AssociationId,
          Name = a.Name,
          ... etc
          Widgets = a.AssociateWidgets.OrderBy(aw => aw.DisplaySequence)
                                      .Select(aw => aw.Widget)
       }
    );

在这里,您将获得一组匿名类型。您可以使用具体类型,例如

public class AssociationInfo
{
    public string Name {get;set;}
    ...
    public IEnumerable<Widget> Widgets{ get;set; }
}

如有必要,请将'new {'替换为'new AssociationInfo {'