我正在研究一种扩展方法,以为多个实体提供过滤功能。涉及的实体具有不同的类型,但是具有可以搜索的公共字段。

下面的代码目前正在运行,但是我想知道是否可以“泛化”,这样就无需进行从泛型到显式类型的转换?

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

09-30 21:21