在MVC应用程序中搜索

时间:2012-05-11 18:42:15

标签: c# asp.net-mvc asp.net-mvc-3 linq entity-framework-4

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

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

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”???

的东西替换空字符串

3 个答案:

答案 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)