【问题标题】:Left Outer Join with Multiple On Statements带有多个 On 语句的左外连接
【发布时间】:2016-03-22 00:08:47
【问题描述】:

我已经做了好几个小时了。这是我尝试过的:

List<SoccerTeamsModel> incompleteFootballTeams = (from fbt in db.footballTeams
    join fbct in db.footballCustomTeams
    on fbt.team_id equals fbct.team_id && fbct.client_id == clientId && fbct.language == selectedLanguage into t
    from ct in t.DefaultIfEmpty()
    where fbt.league_id == leagueId
    orderby fbt.name ascending
    select new SoccerTeamsModel
    {
        TeamId = fbt.team_id,
        ClientId = ct.client_id, 
        etc...
    }).ToList();

我试图复制的 SQL 查询:

  SELECT *
  FROM [SoccerData].[dbo].[footballTeams] AS fbt
  LEFT OUTER JOIN [SoccerData].[dbo].[footballCustomTeams] AS fbct
  ON fbt.team_id = fbct.team_id AND fbct.client_id = 104 AND fbct.[language] = 'fr-FR'  
  WHERE fbt.league_id = 8
  ORDER BY fbt.name ASC

似乎让我感到困惑的是试图放入所有多个“on”子句。我见过一些例子,但它们不包括左外连接。我似乎无法将两者放在一起。

【问题讨论】:

  • 为什么不编写一个存储过程并从应用程序的数据访问层调用它,而不是让您的应用程序代码与数据库查询混淆?
  • @Stan 公司不希望我们为此使用存储过程
  • 我最终选择了使用文字查询字符串而不是使用 LINQ。太复杂了 imo

标签: c# sql sql-server linq tsql


【解决方案1】:

我认为这个查询应该提供一些接近你的 SQL 表达式。它与您的 LINQ 完全不同,但我假设 SQL 的结果是您的目标:

var clientId = 104;
var lang = "fr-FR";
var leagueId = 8;

// Find teams in specifiec league
// Equivalent to this step in SQL: WHERE fbt.league_id = 8
var leagueTeams = footballTeams.Where(fbt => fbt.league_id == leagueId).ToList();

// Find teams that fulfill required conditions
// Equivalent to the On condition in SQL
var teams = footballCustomTeams
.Where(fbct => leagueTeams.Any(fbt => fbct.team_id == fbt.team_id) &&
                fbct.client_id == clientId &&
                fbct.language == lang)
.Select(fbct => new { TeamId = fbct.team_id, ClientId = fbct.client_id });

我没有复制连接,而是简单地将 LINQ 查询划分为多个子查询,每个子查询都缩小了结果范围。可能需要稍作调整,因为我无法访问您的模型,只是尝试从样本中推断出来。

【讨论】:

    【解决方案2】:

    您不需要做出这些多重 ON 语句。这是一个格式不正确的 SQL 语句。 ON 应该只是被连接的两个表之间的关系。

    client_id = 104[language] = 'fr-FR' 移动到 WHERE 的其他部分,就可以了。

    【讨论】:

    • 这实际上是我最初拥有它的方式,但直到我将它移到 ON 部分后我才得到我想要的结果..
    • 作为 ON 的一部分,你得到的结果是你实际应该得到的吗?最坏的情况,你可以直接使用 Entity Framework 来执行一个 SQL 字符串。
    • 是的,这正是我所需要的。在尝试在 LINQ 中执行此操作之前,我想先确保结果在 SQL 中是正确的。是的,也许我会尝试直接执行 SQL 字符串..
    • 能否提供样本数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多