C# 转换LamdaFunctions-Func<;IQueryable<;TD>;,IOrderedQueryable<;TD>&燃气轮机;to Func<;IQueryable<;TE>;,IOrderedQueryable<;TE>&燃气轮机;
有没有办法将C# 转换LamdaFunctions-Func<;IQueryable<;TD>;,IOrderedQueryable<;TD>&燃气轮机;to Func<;IQueryable<;TE>;,IOrderedQueryable<;TE>&燃气轮机;,c#,linq,lambda,C#,Linq,Lambda,有没有办法将Func转换为Func 假设我有Country和CountryModel两个类 class CountryModel { public string Name {get;set;} } class Country{ public string Name{get;set;} } class Repo{ public IEnumerable<TD> Get( Func<IQueryable<TD>, IOrderedQuer
Func
转换为Func
假设我有Country和CountryModel两个类
class CountryModel
{
public string Name {get;set;}
}
class Country{
public string Name{get;set;}
}
class Repo{
public IEnumerable<TD> Get(
Func<IQueryable<TD>, IOrderedQueryable<TD>> orderBy = null)
{
IQueryable<TEntityModel> query = CurrentDbSet;
return orderBy(query).ToList(); // Convert orderBy to TE.
}
}
classcountrymodel
{
公共字符串名称{get;set;}
}
阶级国家{
公共字符串名称{get;set;}
}
类别回购{
公共数字获取(
Func orderBy=null)
{
IQueryable query=CurrentDbSet;
return orderBy(query).ToList();//将orderBy转换为TE。
}
}
使用上述方法,我将传递CountryModel实例。但是查询必须发生在实体类型Country中
可能有一些语法错误。对此表示歉意。公共类回购
public class Repo
{
public IEnumerable<TD> Get<TD, TE>(Func<IQueryable<TD>, IOrderedQueryable<TD>> orderBy = null)
{
IQueryable<TD> query = new List<TE>().Select(t => Convert<TD, TE>(t)).AsQueryable();
return orderBy(query).AsEnumerable(); // Convert orderBy to TE.
}
public TD Convert<TD, TE>(TE input) where TD : class
{
return input as TD;
}
}
{
公共IEnumerable Get(Func orderBy=null)
{
IQueryable query=new List().Select(t=>Convert(t)).AsQueryable();
返回orderBy(query).AsEnumerable();//将orderBy转换为TE。
}
公共TD转换(TE输入),其中TD:class
{
将输入返回为TD;
}
}
如果你的TE型可以铸造成TD型,这应该是可行的
您可以在CountryModel中定义或运算符,以便从您可能发现非常有用的国家/地区转换
public static class MappingExtensions
{
static MappingExtensions()
{
Mapper.CreateMap<CustomAlerts, Domain.Models.CustomAlerts>();
Mapper.CreateMap<Domain.Models.CustomAlerts, CustomAlerts>();
//add mappings for each set of objects here.
//Remember to map both ways(from x to y and from y to x)
}
//map single objects
public static TDestination Map<TSource, TDestination>(TSource item)
{
return Mapper.Map<TSource, TDestination>(item);
}
//map collections
public static IEnumerable<TDestination> Map<TSource, TDestination>(IEnumerable<TSource> item)
{
return Mapper.Map<IEnumerable<TSource>, IEnumerable<TDestination>>(item);
}
}
公共静态类映射扩展
{
静态映射扩展()
{
CreateMap();
CreateMap();
//在此处为每组对象添加映射。
//记住双向映射(从x到y和从y到x)
}
//映射单个对象
公共静态TDestination映射(TSource项)
{
返回Mapper.Map(项目);
}
//地图集
公共静态IEnumerable映射(IEnumerable项)
{
返回Mapper.Map(项目);
}
}
然后在我的代码中,我可以执行以下操作:
var TodayDate = DateTime.Now.AddDays(1);
var Alerts = DB.CustomAlerts
.Where(x => x.EndDate >= TodayDate)
.OrderByDescending(x => x.DateCreated)
.Skip(((id - 1) * 50))
.Take(50);
return Mapping.MappingExtensions.Map<CustomAlert,Models.CustomAlert>(Alerts).ToList();
var TodayDate=DateTime.Now.AddDays(1);
var Alerts=DB.CustomAlerts
.其中(x=>x.EndDate>=TodayDate)
.OrderByDescending(x=>x.DateCreated)
.跳过((id-1)*50))
.采取(50);
返回Mapping.MappingExtensions.Map(警报).ToList();
使用Func
和表达式
将有助于您:
// Initialize AutoMapper
Mapper.Initialize(cfg =>
{
cfg.CreateMap<TE, TD>();
cfg.CreateMap<TD, TE>();
});
public class Repo
{
// Wrap Func with Expression
public IEnumerable<TD> Get(Expression<Func<IQueryable<TD>, IOrderedQueryable<TD>>> orderBy = null)
{
var orderByExpr = Mapper.Map<Expression<Func<IQueryable<TE>, IOrderedQueryable<TE>>>>(orderBy);
IQueryable<TE> query = CurrentDbSet;
// Compile expression and execute as function
var items = orderByExpr.Compile()(query).ToList();
// Map back to list of TD
return Mapper.Map<IEnumerable<TD>>(items);
}
}
//初始化自动映射器
Mapper.Initialize(cfg=>
{
CreateMap();
CreateMap();
});
公开回购
{
//用表达式包裹Func
公共IEnumerable Get(表达式orderBy=null)
{
var orderByExpr=Mapper.Map(orderBy);
IQueryable query=CurrentDbSet;
//编译表达式并作为函数执行
var items=orderByExpr.Compile()(query.ToList();
//映射回TD列表
返回Mapper.Map(项目);
}
}
您可能对Automapper@JuannStrauss感兴趣,请提供一个例子。我想我们可以使用“Project”,但我不确定它在这种情况下的用法。谢谢你的回复。但这可能行不通。我们首先转换记录,然后申请订购。这是首先查询数据库并获取记录并应用排序的吗?谢谢您的回复。我不确定AutoMapper是否能够映射Func委托。我会尝试并更新。我不能说。我从来没有试过。我只做过IQueryable's,这通常足以满足我的需求。对不起,想想看,不,Automapper不会做,但我记得你可以按照这些问题的答案做:谢谢@Juann。但这并没有多大帮助。