如何使用ObjectQuery(Of T)Class检查db条目是否包含某些内容

时间:2012-01-31 01:10:50

标签: database asp.net-mvc-4

我正在使用新的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(“它。”+ orderBy +(desc?“desc”:“”))在做什么?我只使用带有linq的OrderBy。

修改

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

根据this,似乎我需要类似的东西:

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

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

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

但这一切都没有奏效,我只是在黑暗中拍摄,因为我不熟悉这一点。

1 个答案:

答案 0 :(得分: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而不是旧文章。

相关问题