2012-07-06 4 views
2

사용자에 대해 MAX LevelId 값을 선택한 다음 해당 값을 변수에 할당하려고합니다.엔티티에 linq의 최대 값을 선택하십시오.

일반 SQL에서 등가이다 :

SELECT  MAX(LevelID) AS MaxLevel 
FROM   Character 
WHERE  (UserId = 'John') 


//Check User existing Characters max level per user 

INT UserLevelID = 0;

var userQuery = (from o in db.Characters 
where o.UserId == UserID 
     select o); 

UserLevelID = userQuery.Max (LevelID);

여기에 문제가 있습니다. 내가 쿼리 식을 인에서 멀리 변경했습니다

var userLevelId = db.Characters.Where(o => o.UserID == UserID) 
           .Max(o => o.LevelID); 

이 더 cruft에 도입했기 때문에 : 나는 당신이 한 쿼리에서 모든 것을 할 수 있습니다 levelID

답변

8

의 최대 값을 추출하는 방법을 모른다 - 실제로는 가독성에 도움이되는 쿼리 식을 사용하고, 확장 메서드는 더 읽기 쉬운 간단한 솔루션을 요구합니다.

+0

어떻게 값을 UserLevelID (변수)에 할당합니까? 그것은 단지 UserLevelID = userQuery입니까 – MataHari

+1

이 쿼리의 문제점은 집계 함수가 비어 있지 않은 시퀀스가 ​​필요하다는 것입니다. 그리고 Where 확장 메서드가 비어 있지 않은 시퀀스를 반환한다는 보장이 없으므로 이전 문장이 작동하지 않습니다. 실행. LinQToEntities는이 목적에 매우 유용한 "DefaultIfEmpty"확장 메서드를 제공합니다 : Where (...). DefaultIfEmpty (...) Max (...) – Luis

+0

@Luis : 원하는 동작이면 yes입니다. 실제로 아무런 결과가없는 경우 OP가 실제로 원하는 것이 명확하지 않습니다. (그들은이 해답으로 충분히 행복해 보인다 ...) –

3

방법에 대해 :

var theLevel = db.Characters.Where(z => z.UserId == UserID).Max(z => z.LevelID); 
0

var에 최대 = db.Characters.Where (O => o.UserID == 사용자 ID) .Max (O => O를 == null이 0 : o.LevelID) ;

db에 레코드가없는 경우 예외없이 0이 반환됩니다.

관련 문제