2016-09-21 5 views
0

プロパティがダミーのクラスプロパティセットと等しいmyClassの新しいリストを取得しようとしています。私はどのようにこれを行うことができますlinqの表現を書くか分からない。 特に、リストはEntityFrameworkから来ているので、必要でない場合はすべてのデータを一度に取り込むことは望ましくありません。class propertie-valuesのリストで、プロパティの値と等しい値を検索します。

同様:

public class MyClass 
    { 
     public int MyInt { get; set; } 
     public string MyString { get; set; } 
     public bool MyBool { get; set; } 
     public DateTime MyDate { get; set; } 
    } 

    public List<MyClass> myClassList = new List<MyClass>(); 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="myClass">A Dummy Class where stored the searched values</param> 
    /// <param name="searchingPropertiesName">a string array where stored the searched property names</param> 
    public void MySearch(MyClass myClass, string[] searchingPropertiesName) 
    { 
     var propInfo = new List<System.Reflection.PropertyInfo>(); 

     foreach (System.Reflection.PropertyInfo myClassProp in typeof(MyClass).GetProperties(System.Reflection.BindingFlags.Public)) 
     { 
      foreach (string searchPropName in searchingPropertiesName) 
      { 
       if (myClassProp.Name != searchPropName) 
       { 
        return; 
       } 

       propInfo.Add(typeof(EventSeries).GetProperty(searchPropName)); 
      } 
     } 


     var searchedList = myClassList.Where(e => e... "e.Property values are equal propInfo.values"); 
    } 

ありがとう!

+0

特定のプロパティ、またはそれらのすべてを比較しますか? –

答えて

0

私が以下に書いたこのバージョンはLinq-to-Objectsで実際に正しく動作します。興味深い学問的な問題ですが、このアプローチを本番環境では使用しないでください。プロトタイプの値と名前付きプロパティのリストを使った動的述語の考え方は、Linq-to-Entitiesに変換されません(良いSQLは生成されません)。代わりにクエリを動的に作成することをお勧めします(IQueryable.Whereを使用し、LinqKitを探します)。

private static readonly Dictionary<String,PropertyInfo> _properties = typeof(MyClass).GetProperties().ToDictionary(pi => pi.Name); 

public IEnumerable<MyClass>Search(MyClass prototype, IEnumerable<String> propertiesToFilter, IEnumerable<MyClass> items) { 

    IEnumerable<PropertyInfo> selectedProperties = propertiesToFilter 
     .Select(name => _properties[ name ]) 
     .ToList(); 

    return items 
     .Where(i => selectedProperties 
      .Select(pi => pi.GetValue(i) 
      .SequenceEquals(_selectedProperties 
       .Select(pi => pi.GetValue(prototype)) 
     ); 
} 
+0

時間をいただきありがとうございます。それは良い解決策です。 もう少しだと思うけど、それを実際に運用する際には使用したくないので、代替ソリューションを探して、 "automapper"を使って "generic repository pattern"を使うことにしました。 – Neuronetic

関連する問題