C#Linq连接不相等
我正在尝试为一个游戏创建linq连接,该游戏将使用以下查询选择一个玩家不参与的所有位置:C#Linq连接不相等,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我正在尝试为一个游戏创建linq连接,该游戏将使用以下查询选择一个玩家不参与的所有位置: var m_player_positions = from pl in tfs.Players join pos in tfs.Positions on new { X = true } equals new { X = (pl.MainPositionID != pos.PositionID) }
var m_player_positions = from pl in tfs.Players
join pos in tfs.Positions
on new { X = true } equals new { X = (pl.MainPositionID != pos.PositionID) }
select new {PlayerName = pl.Forename, Position = pos.Name};
我现在意识到,我不能在join equals的右侧使用pl,也不能在左侧使用pos,有没有办法用linq执行这个特殊的join?我被打败了,但你来了
var m_player_positions = from pl in tfs.Players
join pos in tfs.Positions
on pl.MainPositionID == pos.PositionID
select new {PlayerName = pl.Forename, Position = pos.Name};
选择对“equals”的限制是为了确保联接中只使用等式。这是因为具有更高级逻辑的查询无法可靠地转换为关系语句
考虑本文件的第2段。
您基本上可以使用
选择many
:
var m_player_positions =
tfs.Players.SelectMany(
pl => tfs.Positions
.Where(pos => pl.MainPositionID != pos.PositionID)
.Select(pos => new {PlayerName = pl.Forename, Position = pos.Name}));
抱歉,刚刚进行了编辑,应该是
pl.MainPositionID!=pos.PositionID
我相信您正在寻找左外连接。请参阅此堆栈:此链接对连接进行了很好的解释,并应说明为什么左侧外部连接可以满足您的需要—只需一个简短的注释。在游戏中使用Linq可能不是一个好主意。虽然编程模型非常好,在某些情况下甚至可以提高性能,但在游戏中,您可能经常看到相反的情况。运行Linq查询将创建许多临时对象,这可能会导致垃圾收集,这些可能会再次导致游戏“结巴”。所以你至少应该避免在游戏循环中使用Linq。@RuneGrimstad你有什么建议?我们只能假设LINQ的解释尽可能精简。对不起,编辑的问题应该是pl.MainPositionID!=pos.PositionID
不确定我是否喜欢被否决,因为球门柱移动了。感觉太像我喜欢的工作了:D