1

私は2つのメインテーブルListingsPlace. リスト テーブルにはPlaceId、 Place entity/row/object を参照するフィールドがあります。このように両方を取得できるように、両方のテーブルに対してクエリを実行したいと思います。

 var query = context.Listings
       .Include("Place")
       .Where(l => l.Place.TypeId == Type.Ro)
       .OrderBy(l => l.Id).ToList();

この後、このクエリにフィルターを適用したいと思います。ここに条件があります。

このような文字列しかありませんvar filter = "1,2,4";。ここで、リストをフィルタリングして、ベッドルームが 1 OR 2 OR 4 に等しいこれらすべてのリストを取得したいと考えています。

私がやった事

 string minBeds = "1,2,4";

 foreach (var item in minBeds.Split(','))
 {
      int minBed = int.Parse(item);
      query = query.Where(l=>l.Place.Bedroom == minBed).ToList();
 }

しかし、これを行うと、ゼロの結果が得られます。

4

1 に答える 1

6

あなたがそれをフィルタリングしている方法に問題があります。最初のパスの後、 where 以外Bedroom == 1のすべてを除外します。2 番目のパスでは、 where 以外のすべてを除外しますがBedroom == 2、リスト内の項目のみがBedroom == 1であるため、結果セットには何もありません。

解決策は、従来の C#||演算子を使用することです。

query = query.Where(l => l.Place.Bedroom == "1" || 
                         l.Place.Bedroom == "2" || 
                         l.Place.Bedroom == "4");

または、より柔軟にしたい場合は、次のContains方法を使用します。

string[] minBeds = "1,2,4".Split(',');
query = query.Where(l => minBeds.Contains(l.Place.Bedroom));

Bedroomが整数の場合、最初に入力を適切な型に変換する必要があることに注意してください。

var minBeds = "1,2,4".Split(',').Select(int.Parse);
query = query.Where(l => minBeds.Contains(l.Place.Bedroom));

また、ここを削除したことに注意してToListください。インデックスでアイテムにアクセスし、結果コレクションからアイテムを追加/削除する必要がない限り、それはおそらく単なるリソースの浪費です。通常、Linq のネイティブな遅延性を利用して、実際に結果が必要になるまでクエリの処理を遅らせることができます。

于 2013-07-02T05:45:51.210 に答える