2013-03-28 3 views
4

Je tente de répertorier un groupe d'associations, dans chaque association est un «widget» qui est attribué à l'association. La liste inclura le nom de l'association et tout widget qui lui est assigné. Le problème est que la liste de widgets interne doit être triée par DisplaySequence.Trier répéteur interne avec requête LINQ

EDMX modèle ci-dessous: EDMX Model

simplifié Répéteur Majoration

<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> 

Requête en cours

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

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

Je suis actuellement en mesure d'obtenir le d ata que je cherche avec la configuration que j'ai maintenant. Je suis à la recherche de l'approche la plus efficace pour obtenir ces mêmes données, cependant, avoir les Widgets répertoriés dans le bon ordre d'affichage.

Y a-t-il une approche différente de la requête linq que je devrais prendre?

Répondre

3

Je cette approche comme celui-ci (non testé):

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) 
     } 
    ); 

Vous obtiendrez une collection de types anonymes. Vous pouvez utiliser un type de béton tels que

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

si nécessaire en remplaçant 'new {' avec 'new AssociationInfo {'