2009-07-02 3 views
2

표 하루 종일 초당LINQ 쿼리 또는 저장 프로 시저

datetime   a1 b1 x2 ... 
07-01-2009 13:10 8 9 10 
07-01-2009 13:11 8 8 2 
07-01-2009 13:12 9 1 1  

1 행 (= 86400 행)과 같은 정해진 열의 최대 값을 반환하는 단계; ~ 40 칼럼; 모두 같은 형식
최대 값을 검색하고 열을 지정할 시간을 찾고 있습니다.

최대 값을 검색하고 시간대 내에서 열의 시간을 지정하여 검색하도록하는 방법을 찾고 있습니다.

Select top 1 time,a1 from table 
    where (datetime>=begin and datetime<end) 
    order by a1 desc 

같은

뭔가 작동하지만 매개 변수로 열을 사용할 수 없습니다.

LINQ 솔루션이나 SP가 좋을 것입니다.

최대 값을 검색하기 위해 전체 데이터 집합을 정렬 할 때 성능에 대해 걱정해야합니까? 어쩌면 MAX 기능이 더 빠를 것입니다. 디모데 (tvanfossen가)

Dim q2 = context.table _ 
    .Where("t >= @0 AND t < @1", begin, end) _ 
    .OrderBy("@0 desc", col) _ 
    .Take(1) _ 
    .Select(col) 

을 제안처럼

UPDATE 나는, 그것을 동적 LINQ 방법을 구현하기 위해 노력하지만이 테이블의 첫 번째 값을 반환합니다. 이것은 최대 값이 아닌 시간 프레임의 첫 번째 값을 반환합니다. SQL 프로파일 러를 보면 ORDER 절이 없다는 것을 알 수 있습니다.
아이디어가 있으십니까?

업데이트 2
어떤 이유로 대체 값이 orderby 절에서 작동하지 않습니다.
.OrderBY은 (골 + "내림차순")는 열 이름은 동적하려면

답변

1

작동, 당신은 VS2008 code samples에서 Dynamic Linq을 사용할 수 있습니다. 그런 다음 정렬 할 열의 이름을 지정할 수 있습니다. SQL에서

var query = context.table 
        .Where(t = t.begin <= date && date < t.end) 
        .OrderBy("a1 desc") 
        .Take(1) 
        .SingleOrDefault(); 
2

:

select max(a1) 
from table 
where (datetime>=begin and datetime<end) 

당신은 표준 집계 함수를 사용하여 정렬 할 필요가 없습니다. 동적으로 열을 선택할 수 있으려면 문자열 연결을 사용하여 동적으로 SQL을 작성해야하지만 열 이름이 실제로 SQL 이름이 아닌 열 이름인지 확인하는 데 매우주의해야합니다. LINQ에서

다시 집합체 사용있다 : 최대로 전달

var res = datacontext.Table 
        .Where(t => t.datetime >= begin && t.datetime < end) 
        .Max(t => t.a1); 

람다 표현식의 최대 값을 얻을 수있는 열을 선택.

Expression<Func<TableType, ColumnType>> colSelector = null; 
switch (column) { 
    case "a1": 
    colSelector = t => t.a1; 
    break; 
    case "b2": 
    colSelector = t => t.b2; 
    break; 
    ... 
} 
var res = datacontext.Table 
        .Where(t => t.datetime >= begin && t.datetime < end) 
        .Max(colSelector); 

또는 두 번째 옵션 : 작은 고정 된 열 집합이있는 경우

첫째, 당신이 좋은, 조각 식을 만들 수있다 : 두 개의 경로가 동적으로 선택한 열을 처리하기 위해 구축 표현식 API로 직접 표현하십시오.자세한 내용은 여기를 참조하십시오 : http://www.albahari.com/nutshell/predicatebuilder.aspx

0

나는 이것이 효과가 있다고 생각합니다. 기본적으로 열을 순서대로 반환하는 함수를 사용하십시오.

var result = Table 
       .OrderByDescending(row => GetColumnOfInterest(row)) 
       .First() 
       .dateTime; 

int GetColumnOfInterest(Row row) 
{ 
    if (...) 
    { 
     return row.a1; 
    } 
    else if (...) 
    { 
     return row.b1; 
    } 
} 
+0

@ 알렉스 : 나는, SQL에 LINQ는 그 SQL로 변환 할 수 없습니다 클라이언트에서 처리 할 수 ​​있습니다에 의해 그 순서를 의미하는 것이라 생각합니다. – Richard

+0

@ 리차드 : 좋은 지적, 네가 맞다고 생각해. –

0

방법에 대해 :

IEnumerable<Table> results = Table; 

switch (condition) 
{ 
    condition 1: 
     results = results.OrderByDescending(row => row.a1); 
    condition 2: 
     results = results.OrderByDescending(row => row.a2); 
    condition 3: 
     results = results.OrderByDescending(row => row.a3); 

    .... 

} 

var result = results.First().dateTime; 
+0

이것은 리차드의 답변과 매우 비슷해 보입니다. 여기서 그는 colSelector를 만듭니다. –