首页 > 解决方案 > 根据选择的搜索条件搜索数据库

问题描述

我正在关注一个讲授 ASP.NET MVC 的 YouTube 系列。在教程中,老师展示了如何制作一个简单的搜索功能,但在我的情况下它是不同的。

我有搜索条件:研究(下拉)、国家(下拉)、状态(下拉)和关键字(输入)。

我的问题是如何查询数据库以根据选择的搜索条件显示结果?

更清楚一点:如果用户只选择了研究国家,那么代码应该使用研究和国家中的值来搜索相应的数据库列。

点击此处查看 UI 设计

:学生

[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 );
    }
}

标签: asp.net-mvcentity-frameworklinq

解决方案


重用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();

推荐阅读