Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Linq连接不相等_C#_Linq_Linq To Entities - Fatal编程技术网

C#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) }

我正在尝试为一个游戏创建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) }
                         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