时间:2019-03-17 标签:c#DynamicWhereclauseinalambda

标签 c# entity-framework lambda where-clause

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

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

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

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

最佳答案

您可以使用类似 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");
        }
    }
}

关于时间:2019-03-17 标签:c#DynamicWhereclauseinalambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34097922/

相关文章:

c# - 无法将 ASP.NET Core 2.1 Angular 应用程序部署到 Azure

c# - 包含类型未实现接口(interface) IMessageFilter

lambda - 从 AWS Lambda 发布到主题停止工作

python - 如何使用 Python 检索 AWS Lambda 公共(public) IP 地址?

C# 方法组奇怪

c# - 关于 NHibernate 的 GuidCombGenerator 的几个问题

C#订阅事件时为什么要使用 "new"关键字?

c# - 如何在不引用 Entity Framework 的情况下以 Entity Framework 代码优先的方式使用空间类型

c# - 实现返回从 EF 实体映射的域模型的 Repository<T>

c# - Entity Framework DbSet 抛出 NullReferenceException