存储搜索结果供以后使用 - 访问结果视图

时间:2011-09-09 14:49:09

标签: c# asp.net-mvc linq

我有一个c#asp.net MVC项目。我正在进行搜索,并希望在其中一个搜索结果的详细信息页面上访问搜索结果。

这样我就可以在详细信息页面上添加< prev | next >个链接,这些链接将链接到上一个搜索结果中的下一个属性。

到目前为止,我的方法是将搜索结果对象放入会话变量中,但我无法弄清楚实际访问它的代码。当我在下面的Session["SearchResults"]进行观察时,我可以看到Result View中的记录,这些记录似乎包含数组。

我知道有人会告诉我,我正在考虑这一切都错了,我迫不及待地想要开悟。

有人建议我应该将最后的搜索结果存储在存储库中作为公共属性,这会是更好的选择吗?或者有人可以推荐一种更好的方式来做我需要做的事情吗?

这是我的控制器

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 个答案:

答案 0 :(得分:1)

不确定您搜索的数据有多大,但最好不要存储搜索结果。它的规模很小,很容易变成资源。为什么要存储如果用户最终只看1或3,则会有500页的搜索结果? 您在会话存储中保留这些可能较大的结果集有多长时间?有多少用户?

只需进行基于页面的搜索,基本上重做搜索客户端执行的每次“下一次”点击。如果你的搜索速度太慢,一个好的索引或类似Lucene.net的东西可以提供帮助。