이런 식으로 생각합니다.
public static IQueryable<T> TopPercentWithTies<T, TKey>(this IOrderedQueryable<T> query, Expression<Func<T, TKey>> groupByExpression, double percent)
{
var groupedQuery = query.GroupBy(groupByExpression);
int numberToTake = groupedQuery.Count() * percent/100;
return groupedQuery.Take(numberToTake).SelectMany(t => t);
}
IEnumerable로만 테스트되었으므로 IQueryable에서 제대로 작동하는지 확실치 않습니다. 또한 TopPercentWithTies()를 호출하기 전에 목록을 정렬했습니다.
다음은 테스트를 위해 사용한 코드입니다.
int percent = 50;
var people = new []
{
new { Age = 99, Name = "Adam" },
new { Age = 99, Name = "Andrew" },
new { Age = 89, Name = "Bob" },
new { Age = 50, Name = "Cecil" },
new { Age = 50, Name = "Doug" },
new { Age = 50, Name = "Everett" },
new { Age = 35, Name = "Frank" },
new { Age = 25, Name = "Greg" },
new { Age = 15, Name = "Hank" }
};
var sortedPeople = people.AsQueryable().OrderByDescending(person => person.Age);
var results = sortedPeople.TopPercentWithTies(person => person.Age, percent);
foreach (var person in results)
Console.WriteLine(person);
희망을 갖고 있거나 적어도 올바른 방향으로 나올 수 있기를 바랍니다. numberToTake를 계산하기위한 로직을 조정할 수도 있습니다.
매우 좋습니다. IOrderedQueryable의 확장이 될 것으로 기대합니다. – Maslow
Oh sweet. 나는 IOrderedQueryable에 대해 몰랐다. 코드를 업데이트했습니다. – Ecyrb
T-SQL'TOP n PERCENT WITH TIES '와 같은 결과를 얻지 못하는 것 같습니다. 5050 개의 항목이있는 '1 2 2 3 3 3 4 4 4 4 ... 100' 데이터를 생각해보십시오. 'TOP 1 PERCENT WITH TIES'는 55 행 (값 '10'까지)을 반환하고 함수는 단 하나의 행만 반환합니다. –