2009-05-23 7 views
0

J'ai regardé StackOverlow mais je n'ai pas trouvé de réponse définitive à ce sujet. Ci-dessous j'ai un extrait de code de ce que j'ai actuellement, et je vais vous expliquer ce que j'essaie d'accomplir.JOIGNEZ-VOUS avec LinqtoSql, sélectionnez seulement TOP (x) sur la table jointe?

Table<Gallery> galleries = pdc.GetTable<Gallery>(); 
Table<GalleryImage> images = pdc.GetTable<GalleryImage>(); 
Table<Comment> comments = pdc.GetTable<Comment>(); 

var query = from gallery in galleries 
      join image in images on gallery.id equals image.galleryid into joinedimages 
      join comment in comments on gallery.id equals comment.galleryid into joinedcomments 
      select gallery; 

gallst.DataSource = query; 
gallst.DataBind(); 

De ce qui précède je ensuite le répéteur suivant:

<asp:Repeater ID="gallst" runat="server" EnableViewState="false"> 
    <HeaderTemplate> 
     <div id="gallery"> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <div class="item"> 
      <h2><%# DataBinder.Eval(Container.DataItem, "name") %> @ <%# DataBinder.Eval(Container.DataItem, "wheretaken") %></h2> 
      <ul class="images"> 
      <asp:Repeater ID="galimgs" runat="server" EnableViewState="false" DataSource='<%# Eval("GalleryImages") %>'> 
       <ItemTemplate> 
        <li><a href="<%# DataBinder.Eval(Container.DataItem, "image") %>.jpg" title="<%# DataBinder.Eval(((System.Web.UI.WebControls.RepeaterItem)Container.Parent.Parent).DataItem, "name") %>" rel="prettyPhoto[<%# DataBinder.Eval(Container.DataItem, "galleryid")%>]" class="thickbox"><img src="<%# DataBinder.Eval(Container.DataItem, "image") %>_thumb.jpg" /></a></li> 
       </ItemTemplate> 
      </asp:Repeater> 
      </ul> 
      <div class="comments"> 
      <asp:Repeater ID="galcomments" runat="server" EnableViewState="false" DataSource='<%# Eval("Comments") %>'> 
       <HeaderTemplate> 
        <ul> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <li><%# GetUserName(new Guid(Eval("userid").ToString())) %> said: <%#DataBinder.Eval(Container.DataItem, "comment1") %> (<%# DataBinder.Eval(Container.DataItem, "date", "{0:dddd MM, yyyy hh:mm tt}") %>)</li> 
       </ItemTemplate> 
       <FooterTemplate> 
        </ul> 
       </FooterTemplate> 
      </asp:Repeater> 
      <uc:makecomment ID="mcomment" runat="server" PhotoID='<%# DataBinder.Eval(Container.DataItem, "id") %>'></uc:makecomment> 
     </div> 
     </div> 
    </ItemTemplate> 
    <FooterTemplate> 
     </div> 
    </FooterTemplate> 
</asp:Repeater> 

Ce que je veux faire (idéalement) est de prendre seulement les 3 premiers commentaires pour chaque galerie.

J'ai essayé ce qui suit requête LINQ sans chance:

var query = from gallery in galleries 
      join image in images on gallery.id equals image.galleryid into joinedimages 
      join comment in comments.Take(3) on gallery.id equals comment.galleryid into joinedcomments 
      select gallery; 

Quelqu'un at-il des suggestions sur la façon dont je peux y parvenir?

Répondre

0

j'ai réussi à le faire fonctionner avec:

 Table<Gallery> galleries = pdc.GetTable<Gallery>(); 
     Table<GalleryImage> images = pdc.GetTable<GalleryImage>(); 
     Table<Comment> comments = pdc.GetTable<Comment>(); 

     var query = from gallery in galleries 
        join image in images on gallery.id equals image.galleryid into joinedimages 
        join comment in comments on gallery.id equals comment.galleryid into joinedcomments 
        select new 
        { 
         name = gallery.name, 
         wheretaken = gallery.wheretaken, 
         id = gallery.id, 
         GalleryImages = joinedimages, 
         Comments = joinedcomments.Take(3) 
        }; 

     gallst.DataSource = query; 
     gallst.DataBind(); 

Avec le prendre eu lieu sur la sélection. Merci pour votre aide tout le monde. Toute suggestion sur la façon d'écrire ce "mieux" serait appréciée.

+0

En termes de mieux, si vous configurez les relations de clé étrangère dans votre base de données, vous n'avez pas à faire explicitement les jointures dans votre code. –

+0

J'ai donc une relation de clé étrangère sur toutes les tables utilisées dans mon exemple. Comment puis-je (dans LINQ) représenter ceci au lieu de faire les jointures ci-dessus? – Robsimm

1

Cela ressemble peut-être au réglage dont vous avez besoin. C'est à partir d'un site d'exemple très utile LINQ.

Cette sample imprime l'identifiant client, l'identifiant de la commande et la date de commande pour les trois premières commandes des clients à Washington. L'exemple utilise Take pour limiter la séquence générée par l'expression de la requête aux trois premiers ordres.

public void Linq21() { 
      List<Customer> customers = GetCustomerList(); 


     var first3WAOrders = (
      from c in customers 
      from o in c.Orders 
      where c.Region == "WA" 
      select new {c.CustomerID, o.OrderID, o.OrderDate}) 
      .Take(3); 

     Console.WriteLine("First 3 orders in WA:"); 
     foreach (var order in first3WAOrders) { 
      ObjectDumper.Write(order); 
     } 
    } 

Résultat

3 premières commandes dans WA:

CustomerID=LAZYK OrderID=10482 OrderDate=3/21/1997 

CustomerID=LAZYK OrderID=10545 OrderDate=5/22/1997 

CustomerID=TRAIH OrderID=10574 OrderDate=6/19/1997 
+0

I essayé ce qui suit (sur la base ci-dessus) var query = (de g dans des galeries de i à g.GalleryImages de c dans g.Comments où i.galleryid.Equals (g.id) où c.galleryid.Equals (g.id) sélectionnez g) .Take (2); Mais c'est simplement faire le .Take (2) sur la table de la galerie. Par conséquent, je ne reçois maintenant que 2 galeries. – Robsimm

+0

Vous avez commencé avec Take (3) et maintenant Take (2)? – DOK

+0

L'exemple ci-dessus était simplement un exemple. Merci beaucoup pour votre réponse. – Robsimm

Questions connexes