【问题标题】:c# Dynamic Where clause in a lambdac# lambda 中的动态 Where 子句
【发布时间】:2015-12-05 06:27:42
【问题描述】:

我有一个允许用户按多个字段搜索的页面。一个可以使用,也可以全部使用。用户可以将每个字段的运算符设置为等于、包含、开始于等...看起来像这样

我正在使用 EntityFrame Work 并使用像这样的 Lamba 检索数据:

listOfPeople = adDB.People.Where(x => x.LastName.StartsWith(lastName) && x.FirstName.StartsWith(firstName)).OrderBy(x => x.LastName)

问题,如何根据用户提供的数据动态创建where子句?

【问题讨论】:

标签: c# entity-framework lambda where


【解决方案1】:

您可以使用类似于 Func 工厂的方式来执行此操作,因为 where 子句采用 Func。

例子:

public class Program
{
    public static void Main(string[] args)
    {
        var people = new[]
        {   
            new Person {FirstName = "Hello", LastName = "World"}, 
            new Person {FirstName = "Foo", LastName = "Bar"},
        };

        Console.WriteLine(people.Where(FuncFactory.GetFilterFunc<Person>(FilterType.Contains, x => x.FirstName, "ello")).Any());
        Console.WriteLine(people.Where(FuncFactory.GetFilterFunc<Person>(FilterType.Equals, x => x.FirstName, "ello")).Any());
        Console.WriteLine(people.Where(FuncFactory.GetFilterFunc<Person>(FilterType.Contains, x => x.LastName, "ar")).Any());
        Console.WriteLine(people.Where(FuncFactory.GetFilterFunc<Person>(FilterType.Equals, x => x.LastName, "ar")).Any());

        Console.ReadKey();
    }
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public enum FilterType
{
    Contains,
    Equals
}

public static class FuncFactory
{
    public static Func<T, bool> GetFilterFunc<T>(FilterType filterType, Func<T, IComparable> propFunc, string filter)
    {
        switch (filterType)
        {
            case FilterType.Contains:
                return x => (propFunc(x) as string).Contains(filter);
            case FilterType.Equals:
                return x => (propFunc(x) as string).Equals(filter);
            default:
                throw new ArgumentException("Invalid FilterType");
        }
    }
}

【讨论】:

    【解决方案2】:

    您可能想要使用谓词生成器:

    http://www.albahari.com/nutshell/predicatebuilder.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2017-05-29
      • 2023-03-29
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多