【发布时间】:2016-04-11 23:27:45
【问题描述】:
我正在尝试为IQueryable<T> 创建一个通用扩展方法。 T 是一个抽象 Player,而 IQueryable 可以包含具体类型 Goalkeeper 和 Striker。
public abstract class Player
{
public string Name { get; set; }
public string Fouls { get; set; }
}
public class Goalkeeper : Player
{
public int Saves { get; set; }
}
public class Striker : Player
{
public int Goals { get; set; }
}
有效的扩展方法(简单的)如下所示:
public static IQueryable<Goalkeeper> NotPerforming(this IQueryable<Goalkeeper> goalkeepers)
{
return goalkeepers.Where(g => g.Saves < goalkeepers.Average(x => x.Saves));
}
public static IQueryable<Striker> NotPerforming(this IQueryable<Striker> strikers)
{
return strikers.Where(g => g.Goals < strikers.Average(x => x.Goals));
}
我可以这样使用:
var badGoalies = players.OfType<Goalkeeper>().NotPerforming();
var badStrikers = players.OfType<Striker>().NotPerforming();
所以现在我想查询所有表现不佳的玩家。
var badPlayers = players.NotPerforming();
我似乎无法正常工作。
public static IQueryable<T> NotPerforming<T>(this IQueryable<T> players)
where T : Player
{
// what to do here?
}
我尝试过......
return players.OfType<Striker>().NotPerforming()
.Union(
players.OfType<Goalkeeper>().NotPerforming()
);
这不起作用。
这样做的最佳实践方式是什么——并且不离开 LINQ-to-SQL,因为我想继续链接扩展方法——并牢记良好的性能?
【问题讨论】:
标签: c# linq-to-sql extension-methods