在 MVC 应用程序中搜索

本文关键字:搜索 应用程序 MVC | 更新日期: 2023-09-27 18:33:59

我有一个页面,为用户提供了四个搜索字段。我假设取字段的交集并显示结果。但是,用户不需要填写所有字段。

在我的控制器中,我有以下代码。

string subject = (string)Session[d.sessionSearchSubject];
string courseNumber = (string)Session[d.sessionSearchCourseNum];
string yearLev = (string)Session[d.sessionSearchYearLev];
string period = (string)Session[d.sessionSearchPer];

if (!(subject.Equals("") && courseNumber.Equals("") && yearLev.Equals("") && period.Equals("")))
{
   db.Courses.Where(a => a.subject.Equals(subject) && a.coursenumber.Equals(courseNumber) &&  a.period.Equals(period...
}
else if (!(subject.Equals("") && courseNumber.Equals("") && yearLev.Equals("")))
{
  // Query the database. 
}
else if (!(subject.Equals("") && courseNumber.Equals("") && period.Equals("")))
{
  // Query the database. 
}
else if (!(subject.Equals("") && yearLev.Equals("") && period.Equals("")))
...

如您所见,会有很多 if 语句。我想知道是否有更好的方法来做到这一点?即,单个查询语句,如果字段为空,则忽略该字段。或者,如果我可以用等效于"任何"???的东西替换空字符串

在 MVC 应用程序中搜索

您可以将结果分解为四个语句,对应于四个条件中的每一个:

var results = db.Courses;
if(!string.IsNullOrEmpty(subject))
    results = results.Where(c => c...);
if(!string.IsNullOrEmpty(courseNumber))
   results = results.Where(c => c...);
...etc...

保持其干净和可扩展,同时仅将必要的条件附加到 SQL 查询。

您不能将该逻辑放入单个 LINQ 语句中吗?像这样:

var results = db.Courses
    .Where(c => (c.subject == subject && c.subject != "")
        || (c.coursenumber == courseNumber && c.coursenumber != "")
        || (c.yearLev == yearLev && c.yearLev != "")
        || (c.period == period && c.period != ""))
    .ToList();

为什么你的控制器中有所有这些逻辑?

您应该在模型中

填充视图字段,然后在模型中有一个函数来为您处理此逻辑。 即在你的模型中有一个名为IsCourseValid()的函数,其中包含你提供的逻辑。 然后,您可以在控制器中调用此模型方法并路由到适当的视图(控制器旨在做什么),如果您只是查询数据库,请通过模型执行此操作。

当前拥有的模式是胖控制器瘦模型,您应该有胖控制器胖模型(所有逻辑都在模型中完成,控制器将您路由到正确的视图)。

提示:

与其做!subject.Equals("")不如使用string.IsNullOrEmpty(subject)