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。但这并没有多大帮助。