4

Where句を動的に追加しようとしているオブジェクトIQueryableがあります。これは、Listingオブジェクトの列に最適ですが、条件付きで、ListingID、AmenityID列を持つナビゲーションプロパティ(ListingAmenities)にIN句を追加したいと思います。

私はcritiera.AmenityIDを持っています。これには、結果をフィルタリングしたいアメニティが含まれている可能性があります。

配列にamenityIDがある場合、次のことを達成しようとしています

select * from Listings l inner join ListingAmenities a on l.ListingID = a.ListingID where a.AmenityID IN(1,2,3)

これが私のコードです(私はEF5を使用しています)

if (criteria.AmenityIDs.Count > 0)
        {
            listings = listings.Where(x => x.ListingAmenities.Any(y => y.AmenityID == criteria.AmenityIDs));
        }

もちろん、これは機能しません。重要な注意点は、これらのWHERE句を動的に追加しているため、IQueryableオブジェクトを構築していることです。

4

1 に答える 1

1

Enumerable.ContainsSQLで変換されるINため、次を使用できます。

if (criteria.AmenityIDs.Count > 0)
{
    listings = listings.Where(x => x.ListingAmenities
        .Any(y => criteria.AmenityIDs.Contains(y.AmenityID)));
}

大きなコレクションではパフォーマンスの問題がAmenityIDsあるため、コレクションが非常に長い場合は注意してください。しかし、100要素程度は問題にはならないはずです。Contains

于 2012-11-03T19:51:17.283 に答える