在 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 语句。我想知道是否有更好的方法来做到这一点?即,单个查询语句,如果字段为空,则忽略该字段。或者,如果我可以用等效于"任何"???的东西替换空字符串
您可以将结果分解为四个语句,对应于四个条件中的每一个:
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)