【问题标题】:Search database depending on chosen search criteria根据选择的搜索条件搜索数据库
【发布时间】:2018-05-10 14:16:50
【问题描述】:

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

我有搜索条件:Studies(下拉菜单)、Country(下拉菜单)、Status(下拉菜单)和关键字强>(输入)。

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

更清楚: 如果用户仅选择了 StudiesCountry,则代码应使用 Studies 和 Country 中的值来搜索相应的数据库列。

Click here for the UI Design

表格:学生

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

【问题讨论】:

  • “没有线索”不是一个明确的问题陈述。它没有告诉我们您要达到什么目标,也没有告诉我们您面临什么困难或遇到什么错误。您显然有一些 线索,否则您不会编写任何代码。我们不知道您的要求是什么,也不知道您坚持其中的哪一部分。请编辑您的问题以更具体。谢谢。
  • @ADyson 我已将问题编辑得更清楚。

标签: asp.net-mvc entity-framework linq


【解决方案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();

【讨论】:

  • 感谢您的帮助。我收到一个错误。 Cannot implicitly convert type 'System.Linq.IQueryable&lt;StudentApplication.Models.Student&gt;' to 'System.Data.Entity.DbSet&lt;StudentApplication.Models.Student&gt;'. An explicit conversion exists (are you missing a cast?
  • @Covert 我的错,这可能是由于查询类型声明 - 我应该将其声明为 IQueryable&lt;Student&gt; query = db.Students;。我更新了答案。这是explanation
【解决方案2】:

执行此操作的最简单方法是测试每个条件,如果满足您的要求,请添加 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)

【讨论】:

  • Request.QueryString[] 在使用 asp.net-mvc 时是非常糟糕的做法。
  • 感谢您的帮助。我收到一个错误。 Cannot implicitly convert type 'System.Linq.IQueryable&lt;StudentApplication.Models.Student&gt;' to 'System.Data.Entity.DbSet&lt;StudentApplication.Models.Student&gt;'. An explicit conversion exists (are you missing a cast?
  • @ErikPhilips 同意。我从OP的问题中得到了这个。你的评论不应该是关于这个问题吗?
猜你喜欢
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2017-10-22
  • 1970-01-01
  • 2020-11-26
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多