0

我正在使用新的 mvc4 ajax 控制器模板,但我不知道如何将搜索添加到他们拥有的数据库查询中。

假设我有一个名为 Article 的模型,这是控制器默认包含的内容:

ObjectQuery<Article> articles = (db as IObjectContextAdapter).ObjectContext.CreateObjectSet<Article>();
articles = articles.OrderBy("it." + orderBy + (desc ? " desc" : ""));

这工作正常,但我不熟悉 IObjectContextAdapter,我不知道如何添加搜索(即查看文章是否包含术语。)通常我会有这样的事情:

var articles = from a in db.Articles.ToList()
                           select a;
if(!String.IsNullOrEmpty(search))
{
    articles = articles.Where(a => a.Title.ToLower().Contains(search.ToLower())
                                       || a.FullArticle.ToLower().Contains(search.ToLower())
                                       || a.TagsAndKeywords.ToLower().Contains(search.ToLower()));
}
switch(orderBy)
{
    case "TimeStamp":
        if(desc)
            articles = articles.OrderByDescending(a => a.TimeStamp);
        else
            articles = articles.OrderBy(a => a.TimeStamp);
            break;
     case "Title":
     ...
}

显然,这样做的新方法更简洁,所以我想坚持这一点。我尝试将它们组合在一起,使用 linq 查询来填充 var 文章,但是我无法使用部分排序,.OrderBy("it." + orderBy + (desc ? " desc" : ""))。

所以我的问题是搜索我的数据库的最佳方式是什么?这个 .OrderBy("it." + orderBy + (desc ? " desc" : "")) 到底在做什么?我只熟悉将 OrderBy 与 linq 一起使用。

编辑

经过大量阅读后,我对正在发生的事情有了更好的理解,尽管我仍然无法让它发挥作用。

据此,似乎需要类似的东西:

articles = articles.Where("it.Title = @searchString");

虽然我认为这只有在 searchString 与标题完全匹配时才有效。虽然我仍然不太明白这是在做什么,但我认为它使用 sql 表达式,所以我认为这可能有效:

articles = articles.Where("it.Title like '%@searchString%'");

但这些都不起作用,我只是在黑暗中拍摄,因为我不熟悉这个。

4

1 回答 1

0

在不更改 mvc4 模板代码的情况下查询模型的最简洁方法是创建一个 IQueryable 对象并对其进行查询,如下所示:

ObjectQuery<Article> articles = (db as IObjectContextAdapter).ObjectContext.CreateObjectSet<Article>();
articles = articles.OrderBy("it." + orderBy + ((bool)desc ? " desc" : ""));

IQueryable<Article> iArticles = articles;

if(!String.IsNullOrEmpty(search))
    iArticles = iArticles.Where(a => a.Title.Contains(search) ||
                                                  a.FullArticle.Contains(search));

Response.AppendHeader("X-Total-Row-Count", iArticles.Count().ToString());

return PartialView(iArticles.Skip(start).Take((int)itemsPerPage));

这样可以使条目保持正确的顺序,并确保返回新的 iArticles 而不是旧的 Articles。

于 2012-02-01T12:25:53.503 回答