2011-09-09 12 views
0

私はc#asp.net MVCプロジェクトを持っています。私は検索を実行しており、検索結果の1つの詳細ページの検索結果にアクセスしたい。後で使用するために検索結果を保存する - 結果ビューにアクセスする

これは、最後の検索結果の次のプロパティにリンクする詳細ページで "< prev | next>"リンクを持つことができるようにするためです。

私のアプローチは、検索結果オブジェクトをセッション変数に入れることですが、実際にアクセスするコードを把握することはできません。以下のセッション["SearchResults"]で監視すると、配列を保持しているように見える結果ビューにレコードが表示されます。

誰かが私にこのすべてについて間違っていると思っていると知っていることを知っています。私は悟りを待つことができません。

誰かが、公共の財産として最後の検索結果をリポジトリに保存するだけでいいのですか?あるいは、誰かが私がやるべきことをやるために全面的に良い方法をお勧めしますか?

この

はここに私のコントローラ

public ActionResult Search(int? page, Search search) 
{ 

    search.regusApi = Convert.ToBoolean(ConfigurationManager.AppSettings["regusApiLiveInventory"]); 
    Session["SearchResults"] = MeetingRoomRepositoryWG.Search(search).AsPagination(page ?? 1, 7); 

    return View(new SearchResultsWG { SearchCriteria = search, Locations = MeetingRoomRepositoryWG.Search(search).AsPagination(page ?? 1, 7) }); 
} 

public ActionResult NiceDetails(String suburb, String locationName, int id) 
{ 
     **Here I want to acceess the session variable** 

     return View(MeetingRoomRepositoryWG.RoomDetails(id).First()); 
} 

あるリポジトリからのコードです:

public static List<Location> Search(Search search) 
{ 

    String LongLatString = search.LongLat; 
    LongLatString = LongLatString.Substring(1, LongLatString.Length - 2); 

    var LonLatSplit = LongLatString.Split(','); 
    var latitude = Convert.ToDecimal(LonLatSplit[0]); 
    var longitude = Convert.ToDecimal(LonLatSplit[1]); 

    using (var context = new MyContext()) 
    { 
     var query = context.Locations.Include("Location_LonLats").ToList(); 

     query.OrderBy(x => (Convert.ToDecimal(x.Location_LonLats.Lat) - latitude) * (Convert.ToDecimal(x.Location_LonLats.Lat) - latitude) 
       + (Convert.ToDecimal(x.Location_LonLats.Lon) - longitude) * (Convert.ToDecimal(x.Location_LonLats.Lon) - longitude)); 

     return query; 
    } 
} 

答えて

1

データはあなたが反対の検索しかし、それは良いでしょうがいかに大きなわからないではない店の検索結果へすべて。それは非常に不十分にスケールされ、かなり簡単にリソースの豚になるでしょう。なぜ保存するのかユーザーが1または3を見終わった場合、500ページの検索結果が表示されますか? これらの潜在的に大きな結果セットをセッション記憶域にどれくらい保持する予定ですか?ユーザー数は何人ですか?

ちょうどページベースの検索を行うだけで、基本的にクライアントが行う「次の」クリックごとに検索をやり直します。あなたの検索が遅すぎる場合、Lucene.netのような良いインデックスが役立ちます。

+0

ユーザーの数はまだわかりませんが、あなたが正しいとすれば、規模が適切でない可能性があります。私が検索に合格して、次のものをクリックしたときにそれをやり直すと、最初にクリックした検索結果を知る必要があります。私は彼らがクリックした結果番号を検索結果ページに保存することができたと思います。ページネーションを使用してどのように検索結果が表示されたかを知るにはどうすればよいのでしょうか?この情報でも、私は上記と同じ形式で検索結果にアクセスする必要があります(これまでできなかった)。 – iKode

+0

検索パラメータをあなたの「次の」リンクと「前の」リンクのURL。または、次と前のボタンをポストフォームにし、検索パラメータをフォームデータとして追加します。 Ajax呼び出しも可能です。 – Joppe

+0

検索メソッドでIEnumerableを返し、yieldを使用してデータを返すと、Linqを使用してページ付けを簡単に行うことができます。結果をスキップするだけでは最適化できません。何とかSkip and Takeパラメータをコールに含めることができればベストでしょう。検索結果のご注文は不幸なことですが、あらかじめ注文しておく必要があります。 – Joppe