2016-06-08 3 views
1

에서 조건이 내가이 쿼리를이 위치에 따라 값을 선택 : 당신이 볼 수 있듯이LINQ 다른 테이블

var result = (from game in db.Games 
        join gameevent in db.Events 
         on game.GameId equals gameevent.GameId into events 
        from _event in events 
        join _targetObjects in db.TargetObjects 
         on _event.TargetObject equals _targetObjects.TargetObjectId into targetss 
        where game.userId == userId 
        select new ProfileViewModel 
        { 
         record = events.Where(s => s.TargetObjectId == _event.TargetObject && _event.EventType == 35).Select(/* Here I want to select a value from targetss, field called TargetName */).ToList() 
        }).First(); 

, 나는 위치에 따라 값을 얻으려면 절 다른 테이블에서. 그것은 새로운 선택 부분에서 가능합니까?

I 이벤트 테이블의 targetObjectId 일치하고 또한 이벤트 유형은 35

어떤 조언되어야 targetObjectId에 따라 targetObject의 이름을 얻으려면?

감사합니다, Laziale의

답변

1

쿼리는 부분으로 분할 가치가 다음 너무 복잡 하나가되기 시작합니다.

아래 예제에서 나는 사용하기가 더 쉽기 때문에 쿼리 키워드 대신 LINQ 확장 메서드 구문을 사용합니다.

// First we collect the relevant games. 
var games = 
    db 
     .Games 
     .Where(game => game.UserId == userId); 

// Then we collect the events of the collected games that have the specified event type. 
var events = 
    db 
     .Events 
     .Join(
      games, 
      gameEvent => gameEvent.GameId, 
      game => game.GameId, 
      (gameEvent, game) => gameEvent 
     ) 
     .Where(gameEvent => gameEvent.EventType == 35); 

// Then we collect the target objects based on the collected events. 
var targetObjects = 
    db 
     .TargetObjects 
     .Join(
      events, 
      targetObject => targetObject.TargetObjectId, 
      gameEvent => gameEvent.TargetObjectId, 
      (targetObject, gameEvent) => targetObject 
     ); 

// Last we select the target name from the collected target objects. 
var records = 
    targetObjects 
     .Select(targetObject => targetObject.TargetName) 
     .ToList(); // The query will be executed at this point. 

정확하게 원하는 것은 아니지만 도움이되기를 바랍니다.

그렇다면 ProfileViewModel이 정확히 있어야하고 어떤 구문을 선택해야하는지 명확하게 설명하십시오.이 구문에 익숙하지 않아서 선택해야합니다.