【问题标题】:C# Linq Join not equalC# Linq Join 不相等
【发布时间】:2013-06-18 07:34:21
【问题描述】:

我正在尝试为一个游戏创建一个 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 执行这个特定的连接?

【问题讨论】:

  • 抱歉,刚刚编辑,应该是pl.MainPositionID != pos.PositionID
  • 我相信您正在寻找左外连接。查看此堆栈:stackoverflow.com/questions/5434313/left-outer-join-in-linq
  • 这个链接很好地解释了连接,应该说明为什么左外连接可以满足您的需求codinghorror.com/blog/2007/10/…
  • 只是一个简短的评论。在游戏中使用 Linq 可能不是一个好主意。虽然编程模型非常好,在某些情况下甚至可以提供性能提升,但在游戏中你可能经常看到相反的情况。运行 Linq 查询将创建许多临时对象,这可能会导致垃圾收集,这些可能会再次导致您的游戏“卡顿”。所以你至少应该避免在你的游戏循环中使用 Linq。
  • @RuneGrimstad 你会建议什么?我们只能假设 LINQ 解释尽可能精简。

标签: c# linq linq-to-entities


【解决方案1】:

您基本上可以使用SelectMany

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}));

【讨论】:

    【解决方案2】:

    我被打败了,但你去吧。

      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};
    

    选择“等于”的限制是为了确保在连接中只使用等式。这是因为具有更高级逻辑的查询无法可靠地转换为关系语句。

    请考虑本文档的第 2 段。 http://msdn.microsoft.com/en-us/library/bb311040.aspx

    【讨论】:

    • 对不起,编辑了问题,应该是pl.MainPositionID != pos.PositionID
    • 不确定我是否喜欢因为球门柱移动而被否决。感觉太像我喜欢的工作了:D
    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多