2012-02-21 28 views
1

我有一個類項目一樣動態LINQ:使用.NET包含的方法生成一個動態搜索方法

public class Item 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public string PartialDescription {get;set;} 
    public string FullDescription {get;set;} 
    public doulbe Price {get;set;} 
} 

我想有一個動態的自定義查詢方法SearchOverAnyFields(),它可以接受任何數量的項目對象的屬性如:

// key is an input string variable 

// one query 
var results = myItems.SearchOverAnyFields(x => x.Name.Contains(key) || x.PartialDescription.Contains(key) || x.Price.ToString().Contains(key)); 

// or another query 
var results2 = myItems.SearchOverAnyFields(x => x.Name.Contains(key) || x.PartialDescription.Contains(key) || x.Price.ToString().Contains(key) 
|| x.FullDescription.Contains(key)); 

// or another query 
var results3 = myItems.SearchOverAnyFields(x => x.PartialDescription.Contains(key) || x.FullDescription.Contains(key)); 

請幫忙。

+0

在你當前的例子中......你怎麼試圖對'Where Where'擴展方法有所不同。 – 2012-02-21 17:04:40

+0

user1219702,當您覺得問題已成功解決時,您應該接受答案。 – occulus 2013-01-21 15:05:45

回答

1

像這樣的事情可能會爲你做這項工作...

public static IEnumerable<Item> SearchOverAnyFields(this IEnumerable<Item> items, string key, params Func<Item,string>[] fields) 
    { 
     return 
      from item in items 
      from field in fields. 
      Where(field => field(item) != null && field(item).Contains(key)) 
      select item; 
    } 


    public static void ExampleUsage(object[] args) 
    { 
     var items = new List<Item> { new Item { Name = "badger" }, new Item { PartialDescription = "badger" }, new Item { } }; 

     // searches items for any item that has "badger" in it's name or PartialDescription 
     var result = items.SearchOverAnyFields("badger", i => i.Name, i => i.PartialDescription); 

     foreach (var res in result) 
      Debug.WriteLine(res); 
    } 

調用ExampleUsage()將打印兩個語句來調試控制檯,以確認他們是你必須正確的項爲他們構建一個ToString方法。

1

我不確定你在找什麼 - 你想要的功能可以通過Where運營商輕鬆實現。

var results = myItems.Where(x => x.Name.Contains(key) || 
    x.PartialDescription.Contains(key) || x.Price.ToString().Contains(key)); 

// or another query 
var results2 = myItems.Where(x => x.Name.Contains(key) || 
    x.PartialDescription.Contains(key) || x.Price.ToString().Contains(key) 
    || x.FullDescription.Contains(key)); 

// or another query 
var results3 = myItems.Where(x => x.PartialDescription.Contains(key) || 
    x.FullDescription.Contains(key)); 

這是否滿足你的要求嗎?

+0

謝謝。然而,我想知道的是一個泛型方法SearchOverAnyFields (參數列表),所以我可以將任何類T傳遞給它,並且類T的屬性數是動態的。而IQueryable myItems是一個局部變量。它不屬於IEnumerable 類型。 – user1219702 2012-02-22 16:49:57