【问题标题】:Dynamic LINQ: Use .NET Contains method to generate a dynamic search method动态 LINQ:使用 .NET Contains 方法生成动态搜索方法
【发布时间】:2012-02-22 20:37:07
【问题描述】:

我有一个类似的类项目

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

请帮忙。

【问题讨论】:

  • 在您当前的示例中...您尝试的操作与 Where 扩展方法有何不同。
  • user1219702,当您认为问题已成功解决时,您应该接受答案。

标签: linq dynamic-linq


【解决方案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));

这符合您的要求吗?

【讨论】:

  • 谢谢。但是,我想知道的是一个通用方法 SearchOverAnyFields(argument list) 所以我可以将任何类 T 传递给它,并且类 T 的属性的数量是动态的。而 IQueryable myItems 是一个局部变量。它不属于 IEnumerable 类型。
【解决方案2】:

这样的事情可能会为你完成这项工作......

    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 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多