2

ユーザーに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」と同等の文字列に置き換えることができる場合は???

4

3 に答える 3

2

結果を、4つの基準のそれぞれに対応する4つのステートメントに分割できます。

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()という関数があります。次に、コントローラーでこのモデルメソッドを呼び出し、適切なビュー(コントローラーが実行することを意図していること)にルーティングできます。データベースにクエリを実行するだけの場合は、モデルを介してこれを実行します。

現在使用しているパターンはFatControllerThin Modelですが、Thin Controller Fat Modelが必要です(すべてのロジックはモデルで実行され、Controllerは正しいビューにルーティングします)。

ヒント:

!subject.Equals("")するのではなく、string.IsNullOrEmpty(subject)

于 2012-05-11T18:47:49.480 に答える