繁体   English   中英

EF Core 过滤一个 Iqueryable<t> 使用自定义过滤器列表</t>

[英]EF Core Filter an Iqueryable<T> using a list of custom Filters

我有一个IQueryable项目(如从数据表创建的模型)。 我想编写一个扩展方法,在其中我给出一个过滤器列表,这个方法过滤我的数据。

让我把它弄清楚 - 说这是我的数据表:

public partial class Person
{
    public long Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
    public string CellPhoneNumber { get; set; }
    public long? PreferencesId { get; set; }
    public long? LanguageId { get; set; }
    public long LocationId { get; set; }
}

现在我想编写一个扩展方法并使用自定义 class “过滤器”过滤我的数据,如下所示:

public class Filter
{
    public string Key { get; set; }
    public string Value { get; set; }
}

像这样:

IQueryable<Person> People= _context.People;
var filters = new List<Filter>();
filters.Add(new Filter() { Key = "FirstName", Value = "Dexter" });
filters.Add(new Filter() { Key = "LastName", Value = "Mac Tavish" });
filters.Add(new Filter() { Key = "PhoneNumber", Value = "001-881-254-1021" });
List<Person> data = People.Filter(filters).ToList();

现在我希望根据给定的过滤器列表过滤我的数据。 我该如何编写该扩展方法。

任何帮助表示赞赏。 我正在使用 EF Core 5 和 C# 5

我很确定SO充满了这样的解决方案,无论如何我已经为这个特定案例编写了扩展:

public class Filter
{
    public string Key { get; set; }
    public string Value { get; set; }
}

public static class FilterExtensions
{
    public static IQueryable<T> Filter<T>(this IQueryable<T> source, IEnumerable<Filter> filters)
    {
        var param = Expression.Parameter(typeof(T), "e");

        Expression body = null;
        foreach (var filter in filters)
        {
            var propExpr = Expression.PropertyOrField(param, filter.Key);
            var value    = filter.Value as object;

            if (value != null && value.GetType() != propExpr.Type)
            {
                // well maybe you need more sophisticated conversion here
                value = Convert.ChangeType(value, propExpr.Type);
            }

            var valueExpr = Expression.Constant(value, propExpr.Type);
            var equalExpr = Expression.Equal(propExpr, valueExpr);

            body = body == null ? equalExpr : Expression.AndAlso(body, equalExpr);
        }

        if (body == null)
            return source;

        var lambda = Expression.Lambda<Func<T, bool>>(body, param);
        return source.Where(lambda);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM