2011-06-21 39 views
0

我有一個最小的情況如下: -選擇左連接默認鍵使用LINQ(到SQL)

Table Posts 

PostID - PK 
PostDateTime 

Table LocalisedPosts 

PostID - JointPK 
Culture - JointPK 
LocalisedTitle 
LocalisedBody 

表LocalisedPosts總會有存在於與表的帖子一個帖子ID匹配項文化「en」。它可能有其他文化的條目,如「es」,「fr」等。

如何構建最簡單的查詢,該查詢將返回具有當前文化的所有帖子(如果可用),或者如果不是默認的「恩「文化。

我的線沿線的思考: -

string lang = "fr" // lang is supposed to be the current culture (i.e. Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName) 

var LocalisedPosts = 
    from p in Posts 
    join pl in LocalisedPosts on p.PostID == pl.PostID 
    where pl.culture == lang || pl.culture == "en" 
    select new {p.PostID, p.PostDateTime, pl.LocalisedTitle, pl.LocalisedBody}; 

但是,這會產生一些線「FR」和「EN」的記載。我想我需要使用orderby/distinct/first或者什麼的,但我無法弄清楚。儘管我使用的是「Or Else」而不是「Or」。

回答

1

這樣的事情?

var restult = (
    from p in Posts 
    let localizedPost = (
     from pl in LocalisedPosts 
     where p.PostID == pl.PostID && (pl.culture == lang || pl.culture == "en") 
     let culturePriority = pl.culture == lang ? 0 : 1 
     orderby culturePriority 
     select pl) 
     .First() 
    select new { p.PostID, p.PostDateTime, localizedPost.LocalisedTitle, localizedPost.LocalisedBody }; 

假設對於每個柱的至少一個局部的後存在任enlang

+0

好吧,它當然有效,包括查詢翻譯。生成的SQL看起來不錯。非常感謝。 –

0
String lang = "fr" 

var LocalisedPosts = 
    from p in Posts 
    let anyWithCurrentLang = (Posts.Any(ps=>ps.LocalisedPost.Culture == lang)) 
    join pl in LocalisedPosts on p.PostID == pl.PostID 
    where pl.culture == lang || (pl.culture == "en" && !anyWithCurrentLang) 
    select new {p.PostID, p.PostDateTime, pl.LocalisedTitle, pl.LocalisedBody}; 

編輯:我想我現在理解你,編輯查詢,以檢查是否有與當前的任何郎後,如果沒有的話,它會搜索英文的。您可能需要編寫一個完整的查詢語句,並在let語句中加入where join,我假設您已經建立了適當的關係。

+0

我不明白爲什麼會奏效;郎應該是當前的文化,爲什麼它是空的? –

+0

我更新了問題,嘗試使其更清晰。 –