2017-01-03 20 views
1

私は、列挙型のリストで要求パラメータを含むAPIを持っています。各列挙型に対応するのは、テーブルの各フィールドです。 [B、]私は列挙型のリストを提出する場合で、:だから私の目的は複数の入力と複数のフィールドを持つLINQ

.... 
public boolean is_a {get; set;} 
public boolean is_b {get; set;} 
public boolean is_c {get; set;} 

public enum Type { 
    a, 
    b, 
    c 
} 

そして、私はこれを持っているエンティティで:あなたは、男は、この上で見ることができますWhereメソッドでレコードis_a = trueを見つけたり、レコードにis_b = trueがあるかどうかを調べることができます。 もう1つ、3つのフィールドのうちの1つだけis_ais_bis_c

更新 詳細をご覧ください。私はちょうどこのように皆さんに私の要求のparamを与える:

public class RequestParam { 
    public string id; 
    public List<Type> types; 
} 

そして、私はこの中types paramsはしてクエリを作りたいです。

+1

何をあなたはLINQに供給でしょう、そして、何が結果でしょうか?この質問は、現在言われているようにかなり曖昧で混乱しています。 – Abion47

+2

enumのFlagsを使用することを検討してください:[FlagsAttribute Class](https://msdn.microsoft.com/en-us/library/system.flagsattribute(v = vs.110).aspx) – Fabio

+0

あなたのコード私たちがコピー、貼り付け、実行できるコンパイル可能な形式でした。 – Enigmativity

答えて

1

研究する時間が経過した後、私たちは、動的クエリを構築するためにLinqkitを使用することができます見つける:

var searchQuery = PredicateBuilder.New<YourModel>(); 

    foreach (Type item in searchParams.types) 
      { 
       switch (item) 
       { 
        case Type.a: 
         searchQuery = searchQuery.Or(e => e.is_a); 
         //query = query.Where(e => e.is_pro); 
         break; 
        case Type.b: 
         searchQuery = searchQuery.Or(e => e.is_b); 
         break; 
        case Type.c: 
         searchQuery = searchQuery.Or(e => e.is_c); 
         break; 
        default: 
         break; 
       } 
      } 

      query = query.AsExpandable().Where(searchQuery); 
1

ジョブに適切なツールを使用します。

列挙型(Integer型)のコレクションでメモリを浪費する代わりに、複数の列挙型値を保存するために1つの整数のみを使用します。列挙型をFlagsAttrbuteで定義し、enumの値を2の累乗に設定します。

[FlagsAttribute] 
public enum MyType 
{ 
    a = 1, 
    b = 2, 
    c = 4, 
    d = 8 
} 

public class Item 
{ 
    public string Id { get; set; } 
    public MyType Type { get; set; } 
} 

次にあなたがMyType列挙

var typeItem = new Item(); 
typeItem.Type |= MyType.c; 
typeItem.Type |= MyType.d; 

の値を追加し、値が特定のenum値

var selected = items.Where(item => item.Type.HasFlag(MyType.a) || 
            item.Type.HasFlag(MyType.b) || 
            item.Type.HasFlag(MyType.c)); 
// use selected values 

かで比較するためのビット演算子&を使用するが含まれているかどうかを確認するために.HasFlag()メソッドを使用することができますより効果的な方法

MyType requiredTypes = MyType.a | MyType.b | MyType.c; // as integer it equals 7 

var items = new[] 
{ 
    new Item { Id = "1", Type = MyType.a | MyType.b}, 
    new Item { Id = "2", Type = MyType.a | MyType.b | MyType.c}, 
    new Item { Id = "3", Type = MyType.a}, 
    new Item { Id = "4", Type = MyType.d}  
} 
const int REQUIRED_TYPES = 7; 
var selected = items.Where(item => ((int)item.Type & REQUIRED_TYPES) > 0); 
// will return items with Ids 
// 1, 2, 3 

その後の代わりに、あなたはまだ私はあなたのエンティティタイプがあると仮定した場合、いくつかの特定のフラグが

var item = new Item(); 
item.AddType(MyType.c); 

if (item.Type.HasFlag(MyType.c)) 
{ 

} 
4

を設定されているかどうかを確認するために.HasFlagメソッドを使用することができます1

public class Item 
{ 
    public string Id { get; set; } 
    public MyType Type { get; set; } 
    public bool IsValid 
    { 
     get 
     { 
      const int REQUIRED_TYPES = 7; 
      var result = (int)item.Type & REQUIRED_TYPES; 
      return result > 0; 
     } 
    } 

    // You can make adding types in more readable way 
    public void AddType(MyType type) 
    { 
     Type |= type; 
    } 
} 

を使用できる3つのブール値のプロパティEntityと呼ばれ、照会しようとしているentitiesのリストがあるとしたら、これは私にとってはうまくいく:

+1

私はOPが 'types.Any'を望んでいるとします。 – Fabio

+0

@Fabio - はい、私はそれを再読したので、おそらく正しいでしょう。 – Enigmativity

+0

あなたの答えは本当に私が望むものに近いと思いますが、あなたは私の新しいアップデートを見てみることができますか?私は 'List'それだけのような' Dictionary'を使用しません。 –

関連する問題