2012-06-08 84 views
3

嗨,我希望有人也許能夠提供以下一些指導:通用表達式過濾器

我試圖創建一個使用反射通用表達式過濾器,可以接收一組規則,並創建一個有效的表達式用於限制從數據源返回的數據。

我遇到的問題是試圖瞭解如何編寫表達式來處理以下情形。

public class Item 
{ 
    public string Name { get; set; } 
    public List<TagTypes> TagTypes { get; set; } 
} 

public class TagTypes 
{ 
    public string Name { get; set; } 
    public List<Tags> Tags { get; set; } 
} 

public class Tags 
{ 
    public string TagName { get; set; } 
} 

的數據基本上看起來像

var itemList = new List<Item> 
      { 
       new Item 
       { 
       Name = "xyz", 
       TagTypes = new List<TagTypes> 
        { 
         new TagTypes 
         { 
          Name = "Genre", 
          Tags = new List<Tags> 
           { 
           new Tags 
            { 
             TagName = "tag1" 
            }, 
           new Tags 
            { 
             TagName = "tag2" 
            }   
           } 
         } 
        } 
       } 

      }; 

我想編寫一個返回我的所有匹配「流派」過濾器,該項目的表情 - >「TAG1」

我可以做到這一點使用以下:

var filtered = from item in itemList 
from tagType in item.TagTypes 
    where tagType.Name == "Genre" 
     from tag in tagType.Tags 
     where tag.TagName == "tag1" 
select item 

,並且具有對正常工作一個基本的工作版本Item類的屬性,但我無法弄清楚如何在TagTypes及其下面執行SelectMany。

基本水平只是以下

var parameter = Expression.Parameter(typeof(T), "itemList"); 
var property = GetPropertyInfo<T>({Propertyname}); 
var propertyAccess = Expression.MakeMemberAccess(parameter, property); 
Expression.Equal(propertyAccess, Expression.Constant({Value})); 

編輯

的數據被存儲在數據庫的NoSQL,過濾器是動態的,並且可以改變,並且被添加到。

使用反射創建Genric過濾器的原因是爲了適應不同的過濾器,而不必知道它們是什麼。用戶將能夠使用過濾器ID請求數據,然後這將根據請求中的過濾器選擇數據。

+0

爲什麼你需要創建一個表達式?只需使用Name和TagName的變量即可。 – adrianm

+0

@adrianm需要創建一個表達式來自想要將查詢傳遞給NoSQL Linq提供者。數據庫可能有60K +記錄,因爲我不知道用戶將過濾的屬性到底是什麼屬性似乎是最明智的解決方案 – SCB

+0

@adrianm上述結構是實際對象的削減版本 – SCB

回答

0

我認爲你可能會過度複雜化。

您只需編寫一個Expression<Func<Item>>Expression<Func<List<Item>>並選擇Body屬性。

例如

Expression<Func<List<Item>> createListOfItems =() => new List<Item> 
     { 
      new Item 
      { 
      Name = "xyz", 
      TagTypes = new List<TagTypes> 
       { 
        new TagTypes 
        { 
         Name = "Genre", 
         Tags = new List<Tags> 
          { 
          new Tags 
           { 
            TagName = "tag1" 
           }, 
          new Tags 
           { 
            TagName = "tag2" 
           }   
          } 
        } 
       } 
      } 

     }; 
+0

我不是100%確定我正確地解釋了自己。根據我的編輯,過濾器將驅動從無SQL數據庫檢索的數據我不會知道用戶在運行時請求了哪些屬性或值。 – SCB

+0

@SCB,那麼我們需要查看對象模型的模式 – smartcaveman