17

顧客データベースに対して「オムニボックス」タイプの検索を実装しようとしています。この検索で​​は、単一のクエリで顧客の任意のプロパティを照合する必要があります。

これが私が達成しようとしていることを説明するためのいくつかのサンプルデータです:

FirstName  | LastName  | PhoneNumber | ZipCode | ...
--------------------------------------------------
Mary       | Jane      | 12345       | 98765   | ...
Jane       | Fonda     | 54321       | 66666   | ...
Billy      | Kid       | 23455       | 12345   | ...
  • クエリがだった場合、"Jane"行#2だけでなく行#1も返されると思います。
  • をクエリする12345と、行#1と#3が生成されます。

今のところ、私のコードは次のようになっています。

IEnumerable<Customer> searchResult = context.Customer.Where(
    c => c.FirstName   == query ||
         c.LastName    == query ||
         c.PhoneNumber == query ||
         c.ZipCode     == query
         // and so forth. Fugly, huh?
);

これは明らかに機能します。エンティティの変更(プロパティの削除、新しいプロパティの導入)は問題を引き起こすため、私には本当に悪い習慣のように聞こえます。

だから:私が投げたエンティティのすべてのプロパティを検索するLINQ-fooはありますか?

4

1 に答える 1

18

まず、クエリと同じタイプのCustomerクラス内のすべてのプロパティを検索します。

var stringProperties = typeof(Customer).GetProperties().Where(prop =>
    prop.PropertyType == query.GetType());

次に、クエリと等しい値を持つプロパティを少なくとも1つ持つコンテキストからすべての顧客を検索します。

context.Customer.Where(customer => 
    stringProperties.Any(prop =>
        prop.GetValue(customer, null) == query));
于 2012-10-11T17:38:02.913 に答える