【问题标题】:Dynamic filter for where clause in Entity Framework 6 (without LINQKit)Entity Framework 6 中 where 子句的动态过滤器(无 LINQKit)
【发布时间】:2019-03-18 11:15:21
【问题描述】:

我使用 Entity Framework 6,不使用 LINQKit。

假设我们有用户界面,用户只能按姓名或仅按姓氏或按姓名和姓氏过滤客户(这非常简化,但描述了我的情况)。

如果我使用静态过滤器 - 它正在工作:

Expression<Func<Client, Boolean>> staticFilter = (c) => c.Name.Equals(someName) && c.Surname.Equals(someSurname);
var filteredClientsStaticFilter = context.Clients.Where(staticFilter).ToList(); 

但如果我尝试动态创建相同的过滤器:

Expression<Func<Client, Boolean>> nameFilter = (c) => c.Name.Equals(someName);
Expression<Func<Client, Boolean>> surnameFilter = (c) => c.Surname.Equals(someSurname);

var expr = Expression.And(nameFilter.Body, surnameFilter.Body);
var dynamicFilter = Expression.Lambda<Func<Client, Boolean>>(expr, nameFilter.Parameters[0]);
var filteredClientsDynamicFilter = context.Clients.Where(dynamicFilter).ToList();

- 异常失败:

在指定的 LINQ to Entities 查询中未绑定参数“u” 表达

但我需要动态创建过滤器,因为这取决于用户选择的过滤条件。

那么如何正确构建动态过滤器呢?

【问题讨论】:

    标签: c# .net entity-framework linq filtering


    【解决方案1】:

    你这两个表达式的(c)参数不一样,见this SO question的答案。

    您可以通过表达式库让表达式使用相同的类型参数。

    首先,创建类型参数:

    var typeParameter = Expression.Parameter(typeof(Client), "c");
    

    ...然后使用声明的类型参数创建相等表达式:

    var nameProperty = Expression.Property(typeParameter, nameof(Client.Name));
    var nameExpression = Expression.Equal(nameProperty, Expression.Constant(someName));
    

    和:

    var surnameProperty = Expression.Property(typeParameter, nameof(Client.Surname));
    var surnameExpression = Expression.Equal(surnameProperty, Expression.Constant(someSurname));
    

    然后您可以使用 type 参数来创建您的过滤器并执行您的查询:

    var expr = Expression.And(nameExpression, surnameExpression);
    var dynamicFilter = Expression.Lambda<Func<Client, bool>>(expr, typeParameter);
    var filteredClientsDynamicFilter = context.Clients.Where(dynamicFilter).ToList();
    

    【讨论】:

    • 顺便说一句,如果有人需要在表达式(即 Client.ClientType.Name)中访问 nested property - 下面的代码可以解决问题var nestedProperty = "Client.ClientType.Name".Split('.').Aggregate((Expression)typeParameter, Expression.Property);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2021-08-21
    • 2012-12-25
    • 2016-07-02
    相关资源
    最近更新 更多