2

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

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

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 语句。我想知道是否有更好的方法来做到这一点?即,如果字段为空,则忽略该字段的单个查询语句。或者如果我可以用相当于“任何”的东西替换空字符串???

4

3 回答 3

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 查询中。

于 2012-05-11T19:03:17.100 回答
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();
于 2012-05-11T18:49:20.743 回答
1

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

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

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

小费:

而不是这样做!subject.Equals("")你可以使用string.IsNullOrEmpty(subject)

于 2012-05-11T18:47:49.480 回答