2013-04-15 27 views
0

我有兩個表是這樣的:如何編寫這個LINQ(或SQL)查詢?

新聞

標識

標題

LanguageId

語言表:

語言

標識

名稱

ISDEFAULT

與LanguageId

現在,作爲參數(例如EN-US),默認語言爲en-GB,我想要得到像這樣的價值:

新聞

編號標題LanguageId

1的en-US

2 2的en-US

...剩下的en-US新聞...

10 10 zh-CN

11 11 EN-GB

...剩下的EN-GB新聞,EN-GB是默認......

20 20 FR-FR

21 21 FR-FR

...剩餘語言等新聞......

目前的解決方案是使用臨時表和遊標獲取了每種語言的消息。有沒有更好的方法來做到這一點?

回答

2

找到適合語言的正確順序是這裏的關鍵(這類似於你有什麼):

from lang in db.Languages 
order by lang.LanguageId == languageId descending, 
     lang.IsDefault descending, 
     lang.Name 

然後添加一個連接:

from lang in db.Languages 
join newsItem in db.NewsItems on lang.LanguageId equals newsItem.LanguageId 
order by lang.LanguageId == languageId descending, 
     lang.IsDefault descending, 
     lang.Name 
select new { newsItem.Id, newsItem.Title, lang.Name } 
0

你可以像下面那樣通過語句向你的tsql使用命令。

ORDER BY CASE LanguageId WHEN 'en-US' THEN 0 WHEN 'en-GB' THEN 1 ELSE 2 END 
0

一些作品後,我的LINQ查詢是:

List<News> GetNews(string languageId) 
{ 
    var languages = db.Languages.ToDictionary(l => l.Id, l => l.IsDefault); 
    var news = db.News.Where(<filter condition>).ToList(); //(otherwise LINQ to Entities will not be able to recognize my custom function) 
     news = news.OrderByDescending(n=>n.LanguageId == languageId).ThenByDescending(n=> OrderByLang(a.LanguageId, languages)).ToList(); 
} 


private bool OrderByLang(string languageId, Dictionary<string, bool> languages) 
{ 
       return (languages[languageId]); 
} 

它正常工作,但它需要整個表返回尋呼應用層,這是不是很optiomal。還有其他建議嗎?