我正在使用新的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%'");
但这一切都没有奏效,我只是在黑暗中拍摄,因为我不熟悉这一点。
答案 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而不是旧文章。