0

新しいmvc4ajaxコントローラーテンプレートを使用していますが、データベースクエリに検索を追加する方法がわかりません。

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": ""))は正確に何をしているのでしょうか。私は、linqでOrderByを使用することに慣れているだけです。

編集

たくさん読んだ後、私は何が起こっているのかをよりよく理解しましたが、それでもこれを機能させることはできません。

これによると、私はこれに似たものが必要なようです:

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が返されるようになります。

于 2012-02-01T12:25:53.503 に答える