c# - WhereIn 动态属性

标签 c# linq

我要构建 LINQ稍后将翻译为 WHERE INsql .在常规用例中,我会这样做:

(querableIQuerable<T>arrIEnumerable<int> )

querable = querable.Where(e => arr.Contains(e.Id));

但是

我的问题是我要过滤的值 ( e.Id ) 是动态的,我将其作为字符串获取。我该怎么做?

一些背景: 我正在做 REST API 端点,用户可以在其中发送他想要过滤值的列​​,所以示例是:

  1. filter: {"id": [1,2]}

我想将其翻译成类似 queryable.Where(e => new [] {1,2}.Contains(e.Id)) 的内容

  1. filter: {"customerId": [4,5]}

我想将其翻译成类似 queryable.Where(e => new [] {4,5}.Contains(e.CustomerId)) 的内容

所以基本上我的输入是一个列名,它是一个 string和 ID 列表,即 IEnumerable<int>

我觉得可以用Expression来实现(类似于 this answer )但我不知道该怎么做。

最佳答案

你可以这样做:

public static class QueryableExtensions {
    public static IQueryable<TEntity> WhereIn<TEntity, TValue>(this IQueryable<TEntity> query, string property, IEnumerable<TValue> values) {
        // x
        var arg = Expression.Parameter(typeof(TEntity), "x");
        // x.Property            
        var prop = Expression.Property(arg, property);
        // values.Contains(x.Property)
        var contains = Expression.Call(
            typeof(Enumerable),
            "Contains",
            new[] { typeof(TValue) },
            Expression.Constant(values),
            prop
        );
        // x => values.Contains(x.Property)
        var lambda = Expression.Lambda<Func<TEntity, bool>>(contains, arg);
        return query.Where(lambda);
    }
}

请注意,您传递的可枚举值类型和属性类型应该匹配才能起作用(因此,如果属性是 int 类型 - 传递 int 数组)。

关于c# - WhereIn 动态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47796587/

相关文章:

c# - 如何筛选具有日期的列表并仅检索 7 天内的数据

c# - 如何在 C# 中使用 LINQ 比较两个 List<String>

c# - DHL API 整合

c# - 如何在winforms中拥有一个ListBox的多种颜色的项目?

c# - SwipeItem XAML 绑定(bind)被忽略

c# - 将存储过程与 LINQ 结合使用

linq - 如何动态地在linq中制定以下查询

c# - 实现具有某些限制的 JOIN 的算法

c# - 同一线程可以在 Azure Functions 中同时运行多个函数吗?

c# - 从 WCF 服务开始。从哪儿开始?