Я пытаюсь создать общий метод расширения для IQueryable<T>
. T - аннотация Player
, а IQueryable может содержать конкретные типы Goalkeeper
и Striker
.Общие методы расширения LINQ to SQL при сборе различных производных типов
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, потому что я хотел бы сохранить методы расширения цепочек и сохранить хорошую производительность?