我正在关注一个教授ASP.NET MVC的YouTube系列。在教程中,教师展示了如何制作简单的搜索功能,但在我的情况下,它有所不同。
我有搜索条件:研究(下拉列表),国家(下拉列入),状态(下拉列表)和关键字(输入)。
我的问题是如何查询数据库以根据所选的搜索条件显示结果?
更清楚: 如果用户仅选择了 Studies 和 Country ,则代码应使用来自Studies和Country的值来搜索相应的数据库列。
表:学生
[StudentID] INT IDENTITY (1, 1) NOT NULL,
[StudentName] VARCHAR (50) NOT NULL,
[StudentStudiesID] INT NOT NULL,
[StudentCountry] VARCHAR (50) NOT NULL,
[StudentCity] VARCHAR (50) NOT NULL,
[StudentStatus] VARCHAR (50) NOT NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([StudentID] ASC),
CONSTRAINT [FK_Students_Studies] FOREIGN KEY ([StudentStudiesID]) REFERENCES [dbo].[Studies] ([StudiesID])
SearchController.cs
public class SearchController : Controller
{
public ActionResult Index()
{
DatabaseEntitiesModel db = new DatabaseEntitiesModel();
int Studies;
int.TryParse(Request.QueryString["Studies"], out Studies);
var Country = Request.QueryString["Country"];
var Status = Request.QueryString["Status"];
var Keyword = Request.QueryString["Keyword"];
IQueryable <Student> SearchQuery = db.Students;
List<SearchViewModel> SVM = SearchQuery.Select(x => new SearchViewModel
{
StudentID = x.StudentID,
StudentName = x.StudentName,
StudentCountry = x.StudentCountry,
StudentCity = x.StudentCity,
StudiesName = x.Study.StudiesName,
StudentStatus = x.StudentStatus
}).OrderByDescending(x => x.StudentID).ToList();
return View( SVM );
}
}
答案 0 :(得分:1)
重复使用SearchQuery
(项目延迟加载,直到您致电ToList()
)并根据需要添加任意数量的Where()
条款/来电:
// the type (IQueryable<Student>) should be defined explicitly
// details: https://stackoverflow.com/questions/21969154/cannot-implicitly-convert-type-system-linq-iqueryable-to-system-data-entity-d
IQueryable<Student> query = db.Students;
if(viewModel.Filter1 != null) {
query = query.Where(i => i.SomeStudentProperty1 == viewModel.Filter1);
}
if(viewModel.Filter2 != null) {
query = query.Where(i => i.SomeStudentProperty2 == viewModel.Filter2);
}
var result = query.ToList();
答案 1 :(得分:-1)
执行此操作的最简单方法是测试每个条件,如果它符合您的要求,请添加Where子句。像这样:
int.TryParse(Request.QueryString["Studies"], out Studies);
var Country = Request.QueryString["Country"];
var Status = Request.QueryString["Status"];
var Keyword = Request.QueryString["Keyword"];
IQueryable<Student> SearchQuery = db.Students;
if(Studies > 0)
{
SearchQuery = SearchQuery.Where(s => s.StudiesID == Studies);
}
if(!string.IsNullOrEmpty(Country))
{
SearchQuery = SearchQuery.Where(s => s.StudentCountry == Country);
}
...More conditions can go here
由于延迟加载,在您调用.ToList()或迭代集合之前,不会执行实际查询。希望这能让你开始走上正轨。
修改强>
我急忙将你的IQueryable改为var。固定。 此外,正如Erik指出的那样,使用Request.QueryString是不可取的。您将要将这些值传递给action方法。所以,像:
public ActionResult Index(int studies, string status, string country, string keyword)