2009-08-27 2 views
3

다음 쿼리를 Linq-to-SQL로 이동하려고합니다. 가능합니까?linq to sql에는 with ties 옵션이 있습니까?

select * from (
Select top (@Percent) percent with ties * 
from(
    Select distinct 
     LoanNumber as LoanNo 
    From CHE 
    Left Join RecordingInfo as Rec 
    On CHE.LoanNumber = Rec.LoanNo 
    Where Channel = 'LINX' 
     and CHE.Doc in ('MTG','MOD') 
     and Rec.LoanNo is null 
     and LoanNumber >= '@LoanNo' 
) A 
order by LoanNo @Order 
) B 
order by LoanNo 

linq의 관계와 관련이 없습니다.

답변

3

이런 식으로 생각합니다.

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를 계산하기위한 로직을 조정할 수도 있습니다.

+0

매우 좋습니다. IOrderedQueryable의 확장이 될 것으로 기대합니다. – Maslow

+0

Oh sweet. 나는 IOrderedQueryable에 대해 몰랐다. 코드를 업데이트했습니다. – Ecyrb

+0

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'까지)을 반환하고 함수는 단 하나의 행만 반환합니다. –