我目前正在用SQLMVC4构建一个网站,使用实体框架来访问.NET Server。
该网站应该有一个复杂的搜索与用户的多个选择,创建一个新的搜索(免费搜索),从过去的5个搜索(历史搜索),从存储的搜索参数中选择。
我遇到麻烦的是保存搜索参数/ SQL字符串的概念,因为它不是基于分段/缓存的,应该存储在某个地方(SQL Server / MongoDB / XML)我很难选择最优化的路径,如果这是SQL的方式,那么可以创建一个实体,将搜索参数存储为实体,然后将其转换为SQL字符串进行搜索,或者将其存储在XML中,然后使用JSON序列化它。
搜索的某些字段不是精确的数据库/实体匹配,并且需要求和/转换(例如将被计算成特定时间的小时)。
我更倾向于将实体框架最好的能力用于这项事业。
如果可能的话,我希望听到一些专家的想法,谢谢。
发布于 2013-04-09 08:52:45
不确定这是否是“最优化的”路径,但认为它看起来很容易实现:
//POCO class of item you want to search from database
public class SearchableItem
{
public string Name { get; set; }
public int Age { get; set; }
}
//MVC View Model for search page
public class SearchParamaters
{
public int? MinAge { get; set; }
public int? MaxAge { get; set; }
}
//Storable version for database
public class SavedSearchParameters : SearchParamters
{
public int SavedSearchParametersId { get; set; }
}
//Use SearchParameters from MVC, or SavedSearchParamaters from EF
public IQueryable<SearchableItem> DoSearch(SearchParamaters sp)
{
IQueryable<SearchableItem> query = db.SearchableItems;
if (sp.MinAge.HasValue) query = query.Where(x => x.Age >= sp.MinAge.Value);
if (sp.MaxAge.HasValue) query = query.Where(x => x.Age <= sp.MaxAge.Value);
return query;
}您还可以将SearchParameters类序列化为XML/JSON并将其保存在任何位置,然后反序列化它并像往常一样将其传递给DoSearch方法,这样就不必每次添加搜索参数时都更改DB模式
编辑:使用序列化的完整示例
\Domain\Person.cs
namespace YourApp.Domain
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}\Domain\SavedPersonSearch.cs
namespace YourApp.Domain
{
//Entity object with serialized PersonSearchParameters
public class SavedPersonSearch
{
public int Id { get; set; }
public string Name { get; set; }
public string Parameters { get; set; }
}
}\Models\PersonSearchParameters.cs
namespace YourApp.Models
{
//MVC View Model for search page
public class PersonSearchParameters
{
public int? MinAge { get; set; }
public int? MaxAge { get; set; }
}
}\Helpers\SearchProvider.cs
using YourApp.Domain;
using YourApp.Models;
namespace YourApp.Helpers
{
public class SearchProvider
{
private YourAppDbContext _context;
public SearchProvider(YourAppDbContext context)
{
//This example uses the DbContext directly
//but you could use a Unit of Work, repository, or whatever
//design pattern you've decided on
_context = context;
}
public IQueryable<Person> SearchPersons(int savedPersonSearchId)
{
var savedSearch = _context.SavedPersonSearches.Find(savedPersonSearchId);
//deserialize (example assumes Newtonsoft.Json)
var searchParams = JsonConvert.Deserialize<PersonSearchParameters>(savedSearch.Parameters);
return SearchPersons(searchParams);
}
public IQueryable<Person> SearchPersons(PersonSearchParameters sp)
{
IQueryable<Person> query = _context.Persons;
if (sp.MinAge.HasValue) query = query.Where(x => x.Age >= sp.MinAge.Value);
if (sp.MaxAge.HasValue) query = query.Where(x => x.Age <= sp.MaxAge.Value);
return query;
}
public void SavePersonSearch(PersonSearchParameters sp, string name)
{
var savedSearch = new SavedPersonSearch { Name = name };
savedSearch.Parameters = JsonConvert.Serialize(sp);
_context.SavedPersonSearches.Add(savedSearch);
_context.SaveChanges();
}
}
}\Controllers\PersonController.cs
namespace YourApp.Controllers
{
public class PersonsController : Controller
{
private SearchProvider _provider;
private YourAppDbContext _context;
public PersonsController()
{
_context = new YourAppDbContext();
_provider = new SearchProvider(_context);
}
//Manual search using form
// GET: /Persons/Search?minAge=25&maxAge=30
public ActionResult Search(PersonSearchParameters sp)
{
var results = _provider.SearchPersons(sp);
return View("SearchResults", results);
}
//Saved search
// GET: /Persons/SavedSearch/1
public ActionResult SavedSearch(int id)
{
var results = _provider.SearchPersons(id);
return View("SearchResults", results);
}
[HttpPost]
public ActionResult SaveMySearch(PersonSearchParameters sp, name)
{
_provider.SavePersonSearch(sp, name);
//Show success
return View();
}
}
}发布于 2013-04-07 14:22:53
将参数转换为Base64字符串。它将帮助您创建任何困难查询,例如,http://www.jobs24.co.uk/SearchResults.aspx?query=djAuMXxQUzoxMHx2MC4x¶ms=cXVlcnlmaWx0ZXI6解码base64使用此服务http://www.opinionatedgeek.com/DotNet/Tools/Base64Decode/default.aspx您还可以查看http://aws.amazon.com/cloudsearch/它可能会让您对worh有一个概念,在您的项目中使用参数
发布于 2013-04-12 09:45:57
像这样的东西可能会起作用:
将搜索参数存储在json/xml中,并持久化到DB表中。1.当您要编辑搜索参数时(如果您允许这样做),请使用json/xml预先填充所选参数,以便用户可以编辑条件。2.当用户想要运行搜索时,从json中获取参数并创建/运行查询。
或
将搜索参数存储在json/xml中并持久存储在DB表中,同时创建sql查询并存储sql字符串(在验证参数之后) 1.当您想要编辑搜索参数时(如果您允许这样做的话),请使用json/xml预先填充所选参数,以便用户可以编辑条件。2.当用户想要运行搜索时,只需获取保存的查询字符串并执行它。
https://stackoverflow.com/questions/15807469
复制相似问题