ASP.NET MVC查询帮助

时间:2011-01-05 16:25:43

标签: asp.net-mvc linq pagination

我的应用上有以下索引方法,显示了一堆文章:

public ActionResult Index(String query)
{
    var ArticleQuery = from m in _db.ArticleSet select m;

    if (!string.IsNullOrEmpty(query))
    {
        ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
    }

    //ArticleQuery = ArticleQuery.OrderBy(m.posted descending);

    return View(ArticleQuery.ToList());
}

如果查询字符串存在,它还可以兼作搜索机制。

问题1.)OrderBy不起作用,我需要更改它以使其按发布日期降序显示结果。

问题2.)我将添加一个非常简单的分页,因此每页只显示4个结果。我怎么会这样做最好?感谢

编辑:除了问题2之外,我正在寻找一个简单的Helper类解决方案来将所述分页实现到我当前的代码中。这些看起来非常好(http://weblogs.asp.net/andrewrea/archive/2008/07/01/asp-net-mvc-quot-pager-quot-html-helper.aspx),但我将如何实施它进入我的应用程序。感谢。

7 个答案:

答案 0 :(得分:2)

  1. ArticleQuery.OrderByDescending(米 => m.posted)
  2. 查看包含a的MvcContrib 分页助手,可以 used on it's own,或与MvcContrib的Grid帮助器结合使用
  3. 编辑:使用MvcContrib

    并不容易

    1 /创建可查询的来源

    public ActionResult Index(String query, int? page)
    {
    var pagesize = 4; // can also be a parameter and/or a configuration setting
    var ArticleQuery = from m in _db.ArticleSet select m;
    
    if (!string.IsNullOrEmpty(query))
    {
        ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
    }
    
    ArticleQuery = ArticleQuery.OrderByDescending(m => m.posted);
    
    return View(ArticleQuery.AsPagination(page, pageSize));
    }
    

    2 /在您的视图中,您可以使用MvcContrib寻呼机帮助方法,如下所示:

     <%= Html.Pager((IPagination)Model)%>
    

    这将输出一个很好的寻呼机控件。

    这是另一种解释,它也使用了MvcContrib网格控件(不是必需的):http://davidhayden.com/blog/dave/archive/2009/06/25/mvccontribgridpagerhelpers.aspx

答案 1 :(得分:1)

您需要重新构建如下(假设第0页是第一页):

public ActionResult Index(String query, int page)
{
    var ArticleQuery = (from m in _db.ArticleSet select m);

    if (!string.IsNullOrEmpty(query))
    {
        ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
    }

    ArticleQuery = ArticleQuery.Skip(page*4).Take(4).OrderByDescending(m => m.posted);

    return View(ArticleQuery.ToList());
}

那里有很多分页解决方案,而不是我推荐的任何其他解决方案。上面的代码演示了一个将要分页的后端实现,你仍然需要提供寻呼机等。

答案 2 :(得分:0)

卡梅伦

我希望通过下载链接的示例可以帮助您解决此问题。我为SO上的其他人制作了这个小应用程序以帮助解决类似的问题。基本上,它显示了如何创建IPagedList接口。

public interface IPagedList
{
    int PageIndex { get; set; }
    int PageSize { get; set; }
    int TotalPages { get; set; }
}

然后创建一个具体类,并通过查询字符串params(包括OrderBy等)填充它。

类似的东西:

public class Test 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int SerialNumber { get; set; }
}
public class TestCollection : IPagedList
{
    public IList<Test> TestList { get; set; }

    // purely for test purposes
    public int PageIndex{ get; set; }
    public int PageSize { get; set; }
    public int TotalPages{ get; set; }

    public TestCollection()
    {
        TestList = new List<Test>();
    }
}

以及它的外观如何:

alt text

你可以在这里抓住它:

http://gatehousemusic.com/downloads/MvcApplication2.zip

玩得开心..

答案 3 :(得分:0)

问题#1:OrderBy(和OrderByDescending,我认为你想要的)方法要求你传递一个函数来指定如何执行排序。大多数人选择使用lambda表达式来执行此操作:

ArticleQuery = ArticleQuery.OrderByDescending(m => m.posted);

有关详细信息,请参阅the MSDN page

问题#2:您需要更改操作方法以接受页码和页面大小参数,然后从视图中传递这些参数。在LINQ查询中,您将使用我喜欢的方法来调用“Skip + Take”方法:

public ActionResult Index(String query, int pageNumber, int pageSize) 
{
    ...
    ArticleQuery = ArticleQuery.OrderByDescending(m => m.posted).Skip(pageNumber * pageSize).Take(pageSize);
    ...
}

答案 4 :(得分:0)

您可以将orderby添加到原始查询中,可以使用.Take([number])

完成前4项。
public ActionResult Index(String query) 
{
     var ArticleQuery = from m in _db.ArticleSet orderby posted descending select m; 
     if (!string.IsNullOrEmpty(query))           
     {
           ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
     }       
     return View(ArticleQuery.Take(4).ToList());
} 

答案 5 :(得分:0)

  1. (和.2的一部分)

    返回视图(ArticleQuery.OrderByDecending(a =&gt; a.posted).Take(4)。ToList());

  2. 改变你的行动(这只是让你开始,而不是最好的答案)

  3. public ActionResult Index(string query, int page)
    {
        var ArticleQuery = from m in _db.ArticleSet select m;
        if (!string.IsNullOrEmpty(query))
        {
            ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
        }
        return View(ArticleQuery.OrderByDecending(a => a.posted).Skip(page * 4).Take(4).ToList());
    }
    

答案 6 :(得分:0)

我正在从头顶回答这个问题,所以请检查这个答案是否正确。

问题1.)这不起作用,因为您正在为IEnumerable分配IOrderedEnumerable。 ArticleQuery类型应该是IEnumerable。

您应该将“var ArticleQuery”更改为“IOrderedEnumerable ArticleQuery”。这应该工作。 如果不是这种情况,那么无论如何你将它转换为List之后只需在订购之前放入ToList()并使用单独的List对象。

问题2.)你需要这样的东西(未经测试):

int PageSize = 4;
public ActionResult Index(String query, int page)
{
    IOrderedEnumerable ArticleQuery = (from m in _db.ArticleSet select m);

    if (!string.IsNullOrEmpty(query))
    {
        ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
    }

    ArticleQuery = ArticleQuery.Skip(PageSize * (page - 1)).Take(PageSize).OrderBy(m.posted descending);

    return View(ArticleQuery.ToList());
}

对于问题2的补充,我不知道你的意思,请详细解释。但总的来说,我不认为你需要一个帮助类来进行分页解决方案。