【问题标题】:How to make only single database query when accessing Linq to SQL IEnumerable object?访问 Linq 到 SQL IEnumerable 对象时如何仅进行单个数据库查询?
【发布时间】:2009-11-11 02:27:33
【问题描述】:

我的应用程序构造一个 Linq To Sql 查询,然后填充一个模型,然后将其传递给视图。然后视图访问 IEnumerable 对象(从 Linq 到 Sql 查询)以显示用户界面。我遇到的问题是,每次视图从模型访问 IEnumerable 对象时,都会进行 linq to sql 数据库查询。我希望数据库被查询一次。

我的控制器如下所示:

    IQueryable<Item> items = (from item in db.Items
                             orderby item.Name ascending
                             select item);
    ItemModel m = new ItemModel(items);

    return View("Index", m);

ItemModel 的定义如下:

public class ItemModel
{

    public ItemModel(IEnumerable<Item> items)
    {
        this.Items = items;
    }

    public IEnumerable<Item> Items { get; private set; }

}

我的视图然后做这样的事情

Item Count: <%= Html.Encode(Model.Items.Count())%>
<% foreach (var item in Model.Items) { %>
    <% Html.RenderPartial("ItemControl", item); %>
<% } %>

每当在视图中访问 Model.Items 时,我都会看到一个数据库查询。在上面的示例中,我会看到两个 Model.Items 调用的两个数据库查询(在实际视图中 Model.Items 被访问两次以上,因此性能损失要差得多)。

我应该如何重组我的视图、模型或控制器以只对数据库进行一次查询?

【问题讨论】:

    标签: c# asp.net-mvc linq-to-sql model-view-controller


    【解决方案1】:

    变化:

    ItemModel m = new ItemModel(items);
    

    收件人:

    ItemModel m = new ItemModel(items.ToArray());
    

    这个想法是执行查询并将结果存储在一个数组中,这样多次访问这些结果只会导致 1 个 DB 命中。

    【讨论】:

    • 废话,你找到那个是对的。我在回答中忽略了它。
    • 非常感谢!就是这样!
    • 我喜欢 Linq to SQL(以及一般的 Linq),因为它可以轻松缓存查询。这是一个放在后兜里的好工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多