Как проверить, содержит ли запись в БД что-либо, используя ObjectQuery (Of T) Class - PullRequest
0 голосов
/ 31 января 2012

Я использую новый шаблон контроллера 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.

Edit

После долгого чтения я лучше понимаю, что происходит, хотя я все еще могуЭто не работает.

Согласно this кажется, что мне нужно что-то похожее на это:

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

, хотя я думаю, что это будет работать, только если searchStringточно соответствует названию.Хотя я все еще не совсем понимаю, что это делает, я думаю, что он использует выражения SQL, поэтому я подумал, что это может сработать:

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

Но ничего из этого не сработало, и я стреляю только в темнотетак как я незнаком с этим.

1 Ответ

0 голосов
/ 01 февраля 2012

Самый краткий способ запроса вашей модели без изменения кода шаблона 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));

Это сохранит записи в правильном порядке, и убедитесь, чтовернуть новые статьи вместо старых статей.

...