2011-08-01 7 views
0

내가있는이 GUID를 포함 두 개의 목록이선택 항목

List<MyCms.Content.Games.Game> games = new List<MyCms.Content.Games.Game>();

을 게임 개체는 다음 두 가지 속성을 사용할 수 있습니다.

game.gamingproperties.software - 소프트웨어의 GUID가 포함되어 있습니다. game.stateproperties.channels는 - 쉼표 목록의 GUID를

를 구분

그래, 내가 알고있는 그 (그것의 allready 40 개 + 사이트 작업)

하지만 난이 시점에서 변경할 수 없습니다, 필드에 을 쉼표로 분리 된 값을 저장하지 좋은 내가하고 싶은 것을

은 (game.stateproperties.channelsactivechannels의 GUID이 포함되어있을 경우 확인하여)가 나타납니다 채널 원래

활성화되어 소프트웨어가합니다 (game.gamingproperties.softwaresoftwarelist를 비교하여) 활성화되어있는 모든 게임을 선택하고있다 , 나는 이것을 이렇게했다 :

foreach (var channel in activeSoftware) 
    { 
     foreach (var match in oGames.AllActive.Where(g => !string.IsNullOrEmpty(g.GamingProperties.UrlDirectGame) && g.GamingProperties.Software.Contains(channel) && g.StateProperties.Channels.Split(',').Intersect(activeChannels).Any())) 
     { 
      games.Add(match); 
     } 
    } 

그러나 나는 그 불쾌한 foreach를 없애고 그냥 linq을 사용할 수 있다고 확신합니다.

답변

0

개체 모델은 약간 이상한 모양 않기 때문에, 나는 그것이 다소 리팩토링 할 수 있다고 생각하지만, 여기 내 대답 : 내가 제대로 모델을 이해한다면

var query = 
    from channel in activeSoftware 
    from match in oGames.AllActive 
    where !string.IsNullOrEmpty(match.GamingProperties.UrlDirectGame) 
    where match.GamingProperties.Software.Contains(channel) 
    where match.StateProperties.Channels.Split(',').Intersect(activeChannels).Any() 
    select match; 

var games = query.ToList(); 

당신은 또한이 작업을 수행 할 수 있습니다 :

var query = 
    from match in oGames.AllActive 
    where !string.IsNullOrEmpty(match.GamingProperties.UrlDirectGame) 
    where match.GamingProperties.Software.Intersect(activeSoftware).Any() 
    where match.StateProperties.Channels.Split(',').Intersect(activeChannels).Any() 
    select match; 

var games = query.ToList(); 

희망이 있습니다.

+0

어떻게 개체 모델이 조금 이상하다고 생각하니? – Dementic

+0

'match.GamingProperties.Software' &'match.StateProperties.Channels'는 그 목적이 조금 길어 보이지만 명확하지 않습니다. 나는 믿음에 대한 나의 대답을 어느 정도 제공해야만했다. – Enigmativity

0

당신의 솔루션이 약간의 리팩터링을 사용할 수있는 것처럼 보이지만 여기에 아이디어가 필요합니다.

var new items = items.ForEach(channel => 
from g in oGames.AllActive 
where (.Where(g => !string.IsNullOrEmpty(g.GamingProperties.UrlDirectGame) && g.GamingProperties.Software.Contains(channel) && g.StateProperties.Channels.Split(',') 
    .Intersect(activeChannels).Any())))  
games.add(items); 

더 구체적으로 말씀 하시려면 클래스 정의를 게시하십시오.