2016-09-21 99 views
0

我嘗試獲取myClass的新列表,其屬性等於虛擬類屬性集。我不知道我如何寫一個linq表達式可以做到這一點。 特別是這個列表來自EntityFramework,所以如果沒有必要,我不想一次拉出所有的數據。在類屬性值列表中搜索,其中等於屬性集值

像:

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」。 – Neuronetic