2013-04-15 2 views
0

У меня есть две таблицы, как это:Как написать этот запрос LINQ (или SQL)?

Новости

Id

Название

LanguageID

Язык таблице:

Языки

Id

Имя

IsDefault

Теперь LanguageID в качестве параметра (например, EN-US), и язык по умолчанию ан-ГБ, Я хочу получить следующие значения:

Новости

IdНазваниеLanguageID

1 1 EN-US

2 2-ен США

... остальные ан-американской новости ...

10 10 ru-RU

11 11 ен-RU

... остающаяся ан-ГБ новость, а ан-ГБ по умолчанию ...

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. Любые другие предложения?

Смежные вопросы