2013-03-28 2 views
4

Я пытаюсь перечислить группу ассоциаций, внутри каждой ассоциации есть «виджет», который присваивается ассоциации. Список будет включать имя ассоциации и любой назначенный ей виджет. Ловушка заключается в том, что список внутренних виджета нужно сортировать с помощью DisplaySequence.Сортировка внутреннего репитера с запросом LINQ

EDMX Модель Ниже: EDMX Model

упрощенный Repeater Mark-Up

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

Я в настоящее время в состоянии получить д ata, что я ищу с настройкой, которую у меня есть сейчас. Я ищу наиболее эффективный подход к получению этих же данных, однако, имея виджетов, перечисленных в правильном порядке отображения.

Есть ли другой подход к запросу linq, который я должен взять?

ответ

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