0

私はProductいくつかのプロパティを持つクラスを持っています:

public class Product
{
   public int id { get; set; }
   public string Name { get; set; }
   public string Category { get; set; }
   public string ProdCountry { get; set; }
}

ここvar products = List<Product>で、事前にわからない特定のプロパティ値をフィルター処理したいとします。すべての{ propertyName, propertyValue }ペアが一致する必要があります (AND 関係):

Dictionary<string, string> properties = GetPropertiesFromClient(); //Key = propertyName, Value = propertyValue

List<Product> products = GetProductList();

foreach(var property in properties)
{
   switch (property.Key)
   {
       case "Name": products = products.Where(p => p.Name == property.Value); 
                    break;

       case "Category": products = products.Where(p => p.Category == property.Value);
                        break;

       case "ProdCountry": products = products. Where(p => p.ProdCountry == property.Value);
                           break;
   }
}

メソッドGetPropertiesFromClient()は常にDictionary<string, string>、どのプロパティといくつが格納されているかを事前に知らない場所を返します。

を使用しないようにするショートカットはありますswitch caseか? 何かのようなもの:

foreach(var property in properties)
{
    products = products.Where(t => t.GetType().GetProperty(property.Key).GetValue(t, null) == property.Value);
}

このコードは (論理的に) 動作するはずですが、例外が発生します。

LINQ to Entities はメソッド 'System.Object GetValue(System.Object, System.Object[])' メソッドを認識せず、このメソッドはストア式に変換できません。

どうすれば目標を達成できますか?

4

1 に答える 1

0

オブジェクトであるため、アクセサーを SQLpropertyに変換しようとしています。get

ゲッターをローカルで実行して、構造値を保存してみてください。次に、プロパティ オブジェクトの代わりにローカル変数と比較します。

foreach(var property in properties)
{
   var x = property.Value;
   switch (property.Key)
   {
       case "Name": products = products.Where(p => p.Name == x); 
                    break;
       //...
    }
}
于 2012-11-21T17:29:49.683 に答える