1

我对泛型表达式有疑问。

我有一个Expression<Func<T, bool>>,我想将其转换Expression<Func<T, bool>>Expression<Func<Y, bool>>. 类的对象与T类 Y 具有相同的属性。

有谁知道如何解决这个问题?

4

1 回答 1

1

执行此操作的“首选”方法是使用包含您关心的属性的接口。

interface IMyProp
{
    string SomeProp {get;}
}

class T : IMyProp
{
    public string SomeProp 
    {
        get
        {
            //Some complicated logic
        }
    }
}

class Y : IMyProp
{
    public string SomeProp {get; set;}
}

只需将您的表达式编码为Expression<Func<IMyProp, bool>>

但是,您不能总是这样做是可以理解的,对于这种情况,您可以使用AutoMapper之类的库

class T
{
    public string SomeProp 
    {
        get
        {
            //Some complicated logic
        }
    }
}

class Y
{
    public string SomeProp {get; set;}
}


//Some initiation code somewhere else in your project
public static void InitializeMappings()
{
    Mapper.CreateMap<T, Y>();
}

public static IQueryable<Y> FilterOnTAndMapToY(IQueryable<T> source, Expression<Func<T,bool>> filter)
{
      return source.Where(filter).Project().To<Y>();
}

现在,这并不能完全将您Expression<Func<T, bool>>变成 a to,Expression<Func<Y, bool>>但它确实允许您使用您的表达式并在应用过滤后T使用它来获得结果。Y

AutoMapper 的Queryable Extensions的工作方式是在执行 LinqToEntities 时查询和强制转换T发生在所有服务器端。Y所以你甚至可以做

public static IQueryable<Y> MultiFilterCast(IQueryable<T> source, Expression<Func<T,bool>> tTypeFilter, Expression<Func<Y,bool>> yTypeFilter)
{
      var filteredStage1 = source.Where(tTypeFilter);
      var castToY = filteredStage1.Project().To<Y>();
      var filteredStage2 = castToY.Where(yTypeFilter);
      return filteredStage2;
}

两者都tTypeFilteryTypeFilter在您获得结果集之前应用于服务器端。

于 2013-09-20T19:12:26.497 回答