我有一个页面,其中为用户提供了四个搜索字段。我想采取字段的交集并显示结果。但是,用户无需填写所有字段。
在我的控制器中,我有以下代码。
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语句。我想知道是否有更好的方法来做到这一点?即一个查询语句,如果该字段为空则忽略该字段。或者,如果我可以用等于“any”???
的东西替换空字符串答案 0 :(得分:2)
难道你不能把这个逻辑放到单个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();
答案 1 :(得分:2)
您可以将结果分成四个语句,分别对应四个标准:
var results = db.Courses;
if(!string.IsNullOrEmpty(subject))
results = results.Where(c => c...);
if(!string.IsNullOrEmpty(courseNumber))
results = results.Where(c => c...);
...etc...
保持它的清洁和可扩展性,同时也只是将条件附加到必要的sql查询。
答案 2 :(得分:1)
为什么在控制器中拥有所有这些逻辑?
您应该在模型中填充View字段,然后在Model中有一个函数来为您处理这个逻辑。即在你的Model中有一个名为IsCourseValid()的函数,它带有你提供的逻辑。然后,您可以在Controller中调用此模型方法并路由到相应的视图(控制器要执行的操作),如果您只是查询数据库,请通过模型执行此操作。
您目前使用的模式是Fat Controller Thin Model,您应该使用瘦控制器胖模型(所有逻辑都在模型中完成,控制器会将您引导到正确的视图)。
提示:
您可以使用!subject.Equals("")
string.IsNullOrEmpty(subject)