ПРИСОЕДИНЯЙТЕСЬ к LinqtoSql, выберите только TOP (x) в объединенной таблице? - PullRequest
0 голосов
/ 24 мая 2009

Я осмотрел StackOverlow, но не смог найти однозначного ответа на этот вопрос.

Ниже у меня есть фрагмент кода того, что у меня есть в настоящее время, и я объясню, чего я пытаюсь достичь.

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

Из вышесказанного у меня есть следующий повторитель:

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

Что я хочу сделать (в идеале) - это взять только первые 3 комментария для каждой галереи.

Я безуспешно пытался выполнить следующий запрос LINQ:

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;

У кого-нибудь есть предложения, как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 24 мая 2009

Похоже, это может быть твик, который вам нужен. Это очень полезный LINQ пример сайта.

Этот образец печатает идентификатор клиента, идентификатор заказа и дату заказа для первых трех заказов от клиентов в Вашингтоне. В примере используется Take, чтобы ограничить последовательность, генерируемую выражением запроса, первыми тремя ордерами.

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

Результат

Первые 3 заказа в 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 голосов
/ 24 мая 2009

Мне удалось заставить его работать:

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

С состоявшимся на выбор. Спасибо за вашу помощь всем. Буду признателен за любые предложения о том, как написать это «лучше».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...