2013-04-12 4 views
1

내 linq 쿼리를 평가하기 위해 LINQPad을 사용하고 있습니다. 내 쿼리는 다음과 같이 간다 :이 쿼리는 0 또는 일부 행 수를 반환 할 수
LINQ를 사용하여 여러 열의 여러 행에서 최대 값 가져 오기?

from o in MyTableFirst 
join p in MyTableSecond on o.TheName equals p.TheName 
where p.TheName == "CBA-123" && !p.Removed && 
    (o.ReturnPeriod ==100 || o.ReturnPeriod ==10) 
select new { 
    HMax1 = o.MaxValue1, 
    HMax2 = o.MaxValue2, 
    HMax3 = o.MaxValue3 
} 


.

것은 LINQPad, 그것은 나에게 이런 일 반환 :

HMax1을       HMax2       HMax3
21.1                널                   22.5
                  24.6                 11.5

자,이 반환 행 & 열에 대해 최대 값을 얻으려면 어떻게해야합니까?
나는 24.6의 반환을 기대하고 있습니다.

당신은

+0

'MyTableFirst'는 어떻게 생겼습니까? 'o.MaxValue1'의 타입은 무엇입니까? –

+0

'[표 DBO]을 만들. MyTableFirst ( \t [ID] [INT] IDENTITY (1,1) 가 \t [TheName는 [NVARCHAR (50) NULL NOT SQL_Latin1_General_CP1_CI_AS 데이터를 부씩 NULL NOT \t [ReturnPeriod] [SMALLINT [PRIMARY] ' – mADy1270

+0

ON NULL, \t [MaxValue1] [플로트] NULL, \t [MaxValue2] [플로트] NULL, \t [MaxValue3] [플로트] NULL 는) DBO] 표를 만들.[MyTableSecond ( \t [ID] [INT] IDENTITY (1,1) NULL NOT, 는 [TheName는 [NVARCHAR (50) NULL NOT SQL_Latin1_General_CP1_CI_AS 데이터, \t [삭제] [비트] NULL NOT COLLATE \t) ON을 [PRIMARY] – mADy1270

답변

2

어떻게 이것에 대해 :

(from o in db.MyTableFirsts 
join p in db.MyTableSeconds on o.TheName equals p.TheName 
where p.TheName == "CBA-123" && !p.Removed && 
(o.ReturnPeriod == 100 || o.ReturnPeriod == 10) 
    select new 
    { 
    Maximum = Math.Max(
     Math.Max((float)(o.MaxValue1 ?? 0), (float)(o.MaxValue2 ?? 0)), 
     (float)(o.MaxValue3 ?? 0) 
    ) 
    }).OrderByDescending(o => o.Maximum).FirstOrDefault(); 

또는 대신 .OrderByDescending의 (O => o.Maximum) .FirstOrDefault()를 사용할 수 .Max (o => o)

+0

고마워요. 쿼리가 성공했습니다. 그러나 아무 결과도 반환되지 않았습니다 .... – mADy1270

+0

* null * 값을 가진 일부 필드 때문에입니까? – mADy1270

+0

모든 null 값을 0 (o.HMax3 ?? 0)으로 변경하므로 문제가되지 않습니다. 지금까지 내가 볼 수있는 한, 결과가없는 유일한 이유는 쿼리가 레코드를 생성하지 않기 때문입니다. 다음과 같이 선택 부분을 변경해야합니다. select new {Val = o.HMax1}). ToList(). 쿼리가 아무 것도 반환하는지 확인합니다. 또한, linqpad에서 이것을 테스트하지 않았 음을 주목하십시오. 방금 쿼리를 테스트 할 콘솔 앱을 작성했습니다. –

1

이 시도 감사 :

(
from o in MyTableFirst 
join p in MyTableSecond on o.TheName equals p.TheName 
where p.TheName == "CBA-123" && !p.Removed && 
(o.Level ==100 || o.Level ==10) 

//combine all of the numbers into one list 
let listOfNumbers = new List<double?>{o.MaxValue1,o.MaxValue2,o.MaxValue3} 

//select the list 
select listOfNumbers 
) 
.SelectMany(c => c) //combine all the lists into one big list 
.Max(c => c) //take the highst number 
+0

LINQPad에서이 쿼리를 실행하면 다음과 같은 메시지가 나타납니다. * NotSupportedException : 매개 변수가없는 집계 연산자 'Max'가 프로젝션보다 지원되지 않습니다. * – mADy1270

+0

@ mADy1270 광산은 LinqPad에서도 잘 작동합니다. 대괄호가 올바르게 설정되었습니다. 내 대답을 편집하여 더 명확하게했습니다. –

+0

모든 것을 복사하여 내 LINQPad에 붙여 넣었습니다. 아직도 나에게 같은 메시지를주고있다. LINQPad 4.43.06을 사용하고 있습니다. – mADy1270

관련 문제