asp.net-mvc - 根据选择的搜索条件搜索数据库
问题描述
我正在关注一个讲授 ASP.NET MVC 的 YouTube 系列。在教程中,老师展示了如何制作一个简单的搜索功能,但在我的情况下它是不同的。
我有搜索条件:研究(下拉)、国家(下拉)、状态(下拉)和关键字(输入)。
我的问题是如何查询数据库以根据选择的搜索条件显示结果?
更清楚一点:如果用户只选择了研究和国家,那么代码应该使用研究和国家中的值来搜索相应的数据库列。
表:学生
[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])
搜索控制器.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 );
}
}
解决方案
重用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();
推荐阅读
- python - python - 用 001,002 等重命名文件
- php - Html2Canvas 通过 php 将 png 图像保存到服务器,显示一半图像并且文件大小减小
- jenkins - 詹金斯管道脚本处理子目录中的模块
- java - 在 PaginatedScanList 上使用 batchDelete() 时出现 Java 堆大小错误 - DynamoDB
- c++ - 声明在 C++ 中调用的函数的以下方法是什么?
- python - SpeechRecognition Package (https://pypi.org/project/SpeechRecognition/) 可以离线工作吗?
- javascript - Heroku 返回 400 错误请求响应 (Socket.IO Node.js)
- kubernetes - K8S 中 Replication Controller 和 LivenessProbs 的区别
- python-3.x - 管道内决策树的可视化
- html - 如何修复从移动设备查看时变得不可见的文本