我对泛型表达式有疑问。
我有一个Expression<Func<T, bool>>
,我想将其转换Expression<Func<T, bool>>
为Expression<Func<Y, bool>>
. 类的对象与T
类 Y 具有相同的属性。
有谁知道如何解决这个问题?
我对泛型表达式有疑问。
我有一个Expression<Func<T, bool>>
,我想将其转换Expression<Func<T, bool>>
为Expression<Func<Y, bool>>
. 类的对象与T
类 Y 具有相同的属性。
有谁知道如何解决这个问题?
执行此操作的“首选”方法是使用包含您关心的属性的接口。
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;
}
两者都tTypeFilter
将yTypeFilter
在您获得结果集之前应用于服务器端。