2015-12-16 41 views
0

我已經在這上好幾個小時了。這是我已經試過:左邊的外部加入了多個開啓聲明

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 

什麼是搞亂了我,似乎正試圖把所有「的」條款多。我看過一些例子,但他們不包括左外連接。我似乎無法把兩者結合在一起。

+0

爲什麼不編寫存儲過程並從應用程序的數據訪問層調用它,而不是使用數據庫查詢混淆應用程序代碼? –

+0

@Stan公司不希望我們爲此使用存儲過程不幸 – user1189352

+0

我結束了使用文字查詢字符串而不是使用LINQ的路線。太複雜了imo – user1189352

回答

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查詢到更多的子查詢,每個縮小的結果了。可能需要稍微調整,因爲我沒有訪問你的模型,只試圖從樣本中推斷出來。

0

您不需要製作那些多個ON語句。這是格式錯誤的SQL語句。 ON應該只是兩個正在連接的表之間的關係。

client_id = 104[language] = 'fr-FR'移到WHERE的其他部分,您就會好起來的。

+0

這實際上是我原來的樣子,但是我沒有得到我要找的結果,直到我將它移動到ON部分中。 – user1189352

+0

是否將結果作爲ON的一部分獲得應該實際上得到?最糟糕的情況是,您可以直接使用Entity Framework來執行SQL字符串。 – krillgar

+0

是的,這正是我需要的。在我嘗試在LINQ中完成之前,我想確保SQL中的結果是正確的。亞可能我會嘗試直接做SQL字符串.. – user1189352