2012-08-15 72 views
0

我有以下查詢:LINQ的外部聯接語法

var query = 
    from modules in _Context.Modules 
    join moduleStrings in _Context.ModuleStrings on modules.MID equals moduleStrings.MID 
    join strings in _Context.Strings on moduleStrings.SID equals strings.SID 
    join stringTexts in _Context.StringTexts on strings.SID equals stringTexts.SID into stringsEmpty 
    from stringTexts in stringsEmpty.DefaultIfEmpty() 
    join languages in _Context.Languages on stringTexts.LID equals languages.LID 
    where modules.MID == MID && LID == languages.LID 
    select new GridData6S() 
    { 
     Name = strings.Name, 
     Text = stringTexts != null ? stringTexts.Text : "" 
    }; 

我想加入它,這樣我看空的文本,如果stringTexts爲null。

這可能是一些小事情,但我一直在看這一個小時,無法弄清楚。這是我得到的最接近的。

+0

對不起,我現在看到你已經在那裏有DefaultIfEmpty。我想知道是否因爲你正在嘗試加入語言。你有沒有嘗試把DefaultIfEmpty放在最後一次加入? – 2012-08-15 08:36:29

+0

是的,我只是想着這些線,我會嘗試! – ProgrammerAtWork 2012-08-15 08:40:51

+0

你也可以嘗試''join'和'from'子句都不使用'stringTexts',以防有所作爲。 – Rawling 2012-08-15 08:51:26

回答

0

您正在過濾掉任何不是LID = languages.LID的語言,因此當languages/stringTexts爲null時,此條件永遠不會爲真。

另外,作爲唯一的原因,你似乎能夠加入到語言表是把蓋子弄這也是連接條件,你可以直接跳過加入到語言

這同樣適用於模塊真... ..

這可能有助於並且是稍微簡單一些

var query = 
    from moduleStrings in _Context.ModuleStrings 
    join strings in _Context.Strings on moduleStrings.SID equals strings.SID 
    join stringTexts1 in _Context.StringTexts.Where(x=>x.LID==LID) on strings.SID equals stringTexts.SID into stringsEmpty 
    from stringTexts in stringsEmpty.DefaultIfEmpty() 
    where moduleStrings.MID == MID 
    select new GridData6S() 
    { 
     Name = strings.Name, 
     Text = stringTexts != null ? stringTexts.Text : "" 
    };