уменьшить количество рейсов - linq-to-sql - PullRequest
0 голосов
/ 09 февраля 2011

Можно ли уменьшить количество обращений к базе данных при выполнении действия asp.net mvc 2 для следующего конкретного случая и вообще?Я использую linq-to-sql.В следующем коде получается что-то вроде 60 выборок, что требует 60 циклов в базу данных.Как я могу уменьшить количество поездок туда и обратно?

Если потребуется больше моего кода, я опубликую его.

Модель моего вида:

public class ArticlesContainerViewModel
{
    public ArticlesContainerViewModel()
    {
    }

    public Article CategoryArticle { get; set; }

    public IList<ArticlesNode> CategoryNodes { get; set; }
}

public class ArticlesNode
{
    public Article NodeArticle { get; set; }

    public IQueryable<Article> NodeItems { get; set; }
}

Вид:

<ul class="tabs">
        <% foreach (var category in Model)
           { %>
        <li><a href="#" class="s">
            <%= Html.Encode(category.CategoryArticle.AbbreviatedTitle) %></a></li>
        <% } %>
    </ul>
    <!-- tab "panes" -->
    <div class="panes">
        <% foreach (var category in Model)
           {
        %>
        <div>
            <table style="width: 100%;" cellpadding="0" cellspacing="0">
                <% int counter = 0; foreach (var node in category.CategoryNodes)
                   {
                %>
                <%if (counter % 2 == 0)
                  { %>
                <tr>
                    <%} %>
                    <td class="content-container">
                        <div class="index-node-title">
                            <%= Html.Encode(node.NodeArticle.ArticleTitle)%>&nbsp;<span class="small1 darkGrey2">(<%= Html.Encode(node.NodeItems.Count().ToString())%>)</span>
                        </div>
                        <div class="index-node-content">
                            <ul class="index-node-content-list">
                                <% foreach (var item in node.NodeItems.Take(2))

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Код немного грязный, если вы спросите меня, и я предполагаю, что тип Model имеет тип IList<ArticlesContainerViewModel> или что-то подобное. Ваша проблема в том, что вы используете IQueryable это "высоко" в приложении. Структура, для которой я бы выбрал:

1. First select all categories and put that in your `ViewModel` using a single query. 
2. From all your categories select all your articles or what else from the db in a single query, put the result in a dictionary where category is the key.

Таким образом, вы сможете получить только два запроса вместо m*(n+1), как сейчас.

0 голосов
/ 09 февраля 2011

Посмотрите на PLINQO.Это оптимизирует ваши запросы. www.plinqo.com

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