我有两个包含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多个站点上工作)
我想要做的是,选择所有软件处于活动状态的游戏(通过将softwarelist
与game.gamingproperties.software
进行比较),以及它们出现的频道是否有效(通过检查{{1} }}包含任何game.stateproperties.channels
guids)
最初,我这样做了:
activechannels
但我相信我可以摆脱那些讨厌的foreach而只是使用linq。
答案 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();
希望有所帮助。