创建一个通用扩展方法以提供筛选功能

本文关键字:方法 功能 筛选 扩展 一个 创建 | 更新日期: 2023-09-27 18:24:09

我正在开发一种扩展方法,为几个实体提供过滤功能。所涉及的实体类型不同,但具有可在上搜索的公共字段

下面的内容目前正在工作,但我想知道这是否可以"泛型化",这样就不需要从泛型类型转换为显式类型了?

public static IQueryable<T> PriceLow<T>(this IQueryable<T> query, decimal? priceLow)
{
    if (typeof(T) == typeof(Entity1))
    {
        var innerQuery = (IQueryable<Entity1>) query;
        var results = priceLow.HasValue ? innerQuery.Where(o => (o.ListPrice > priceLow.Value)) : innerQuery;
        return (IQueryable<T>) results;
    }
    if (typeof(T) == typeof(Entity2))
    {
        var innerQuery = (IQueryable<Entity2>)query;
        var results = priceLow.HasValue ? innerQuery.Where(o => (o.ListPrice > priceLow.Value)) : innerQuery;
        return (IQueryable<T>)results;
    }
    return null;
}

示例用法:

    var foo = _repository.GetAllEntity1().PriceLow(_searchCritera.PriceLow);

创建一个通用扩展方法以提供筛选功能

如果您可以更改这两种实体类型以实现具有共享属性/方法的公共接口,那么您可以使用泛型类型约束。这也适用于共享基类。

这样做,然后你的签名看起来是这样的(省略了杂乱的细节):

public static IQueryable<T> PriceLow<T>(...)
  where T : ICommonInterface

让实体从包含可搜索字段的基类型继承怎么样。这样,您的筛选方法只需要知道一个基本类型。

一种方法是定义一个接口,并将该接口添加为类继承的内容之一。该接口根本不需要包含任何内容。它可以只是一个标记。

然后让你的扩展方法需要的参数就是那个接口。