0

私は現在asp.netmvc3を勉強していて、複数のサイトのコースビデオを無駄にしているのですが、特定のコードに興味があります。

ここにあります:

 public ActionResult Index(string state)
        {
            //var restaurants = context.Restaurants.ToList();
            var restaurants = from r in context.Restaurants
                              where r.Address.State == state || (state == null)
                              select r;
            return View(restaurants);
        }

明らかに、stateパラメーターはクエリのフィルター処理に使用されるため、state = CAの場合、状態値がCAの行のみが取得されます。取得できない部分は、||を追加する理由です。state == nullを使用すると、クエリですべての行を取得できます。

上記のコードと非常によく似た別のコードを次に示します。

var students = from s in studentRepository.GetStudents()
                           select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
                                       || s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
            }

これでは、パラメータが空かnullかをチェックし、where句を追加して別のクエリを設定します。

したがって、その状態を追加すると実際に何が起こっているのか== null

サー/マーム、あなたの答えは大いに役立つでしょう。ありがとう++

4

2 に答える 2

2

これは単純なブール論理です。

r.Address.State == state || (state == null)

true || false -> true //(CA=CA)   ||(CA=null)
false|| true  -> true //(FL!=null)||(null=null)..null=null no matter the state from the database
false|| false -> false //(FL!=CA) ||(CA!=null)

2番目のケースでは、データベース内の何もチェックしていないためwhere、渡されたパラメーターに対する静的チェックであるため、常にtrueが返されます。したがって、クエリからすべてを取得するのはなぜですか。

これの目的は、パラメーターが指定された場合にのみフィルターのように機能するようにすることだと思います。提供されていない場合、フィルターは適用されません。(null==null)

2番目の例では、基本的に上記と同じことを行っています。静的チェックをLINQに組み込むことすらしていません。

簡単に次のように書くことができます。

from s in studentRepository.GetStudents()
where String.IsNullOrEmpty(searchString) || 
    s.LastName.ToUpper().Contains(searchString.ToUpper()) ||                                       
    s.FirstMidName.ToUpper().Contains(searchString.ToUpper())
select s;

ここでも、ブールORロジックにより、パラメーターに対するチェックがデータチェックのいずれかをオーバーライドします。

これは、2番目と同様の方法で記述された最初のクエリです。

var restaurants = from r in context.Restaurants
    select r;
if(state != null)
    restaurants = restaurants.Where(x=>x.Address.State == state);

ここにブール論理の詳細へのリンクがあります、あなたがそれをグーグルするならば、これには実際にたくさんあります。

于 2013-02-19T17:53:33.493 に答える
1

最初の例では:|| はOR演算子であり、クエリは、状態がnullの場合はORになります。これは、必ずしもすべてのレコードを返すことを意味するわけではありません。したがって、戻り値は状態とnullの状態になります。

2番目の例は、プルする検索条件があるかどうかを確認することです。
基本的に:検索条件がある場合は、姓に検索条件が含まれているレコード、または名に検索条件があるレコードを取得します。

わかる?ある種の条件に基づいてレコードをプルバックしようとしているだけです...特定の状態に一致するかnullであるレコードが必要な場合があります...次に、それらに対して何らかのアクションを実行します。

于 2013-02-19T17:57:45.597 に答える