Динамический LINQ: используйте метод .NET Contains для создания метода динамического поиска - PullRequest
1 голос
/ 21 февраля 2012

У меня есть класс Item, такой как

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 (), который может принимать любое количество свойств объекта Item, например:

// 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));

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Я не совсем уверен, что вы ищете здесь - желаемую функциональность можно легко реализовать с помощью оператора 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));

Соответствует ли это вашему требованию?

1 голос
/ 21 февраля 2012

Что-то вроде этого, вероятно, сделает эту работу за вас ...

    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 для них.

...