![](/img/trans.png)
[英]EF Core 2, .NET CORE 2 :How do I query the same column for multiple conditions using IQueryable<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.