使用linq从列表中选择项目,其中项目显示在其他两个列表中

时间:2011-08-01 10:18:34

标签: linq contains where any

我有两个包含guid的列表:

    var activeSoftware = channels.ByPath("/software/").Children.Where(c => c.StateProperties.IsActive).Select(c => c.Guid);
    var activeChannels = channels.ByPath("/game-channels/").Children.Where(c => c.StateProperties.IsActive).Select(c => c.Guid);

和另一个游戏列表:

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

游戏对象有两个可以使用的属性:

game.gamingproperties.software - 其中包含软件的指南 game.stateproperties.channels - 逗号分隔的guid列表

是的,我知道在字段中保存逗号分隔值并不好, 但我不能在这个时间点改变它(它已经在40多个站点上工作)

我想要做的是,选择所有软件处于活动状态的游戏(通过将softwarelistgame.gamingproperties.software进行比较),以及它们出现的频道是否有效(通过检查{{1} }}包含任何game.stateproperties.channels guids)

最初,我这样做了:

activechannels

但我相信我可以摆脱那些讨厌的foreach而只是使用linq。

2 个答案:

答案 0 :(得分: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);

如果您希望我更具体,请发布课程定义。

答案 1 :(得分: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();

希望有所帮助。