0

我有两个这样的表:

消息

ID

标题

语言标识

语言表:

语言

ID

姓名

是默认值

现在使用 LanguageId 作为参数(例如 en-US),默认语言是 en-GB,我想得到这样的值:

消息

Id 标题 LanguageId

1 1 zh-CN

2 2 zh-CN

...剩下的美国新闻...

10 10 zh-CN

11 11 zh-CN

...剩余的 en-GB 新闻,因为 en-GB 是默认的...

20 20 FR-FR

21 21 FR-FR

...其余语言的其他新闻...

当前的解决方案是使用临时表和游标来获取每种语言的新闻。有没有更好的方法呢?

4

3 回答 3

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 }
于 2013-04-15T20:41:54.030 回答
0

您可以对 tsql 使用 order by 语句,如下所示。

ORDER BY CASE LanguageId WHEN 'en-US' THEN 0 WHEN 'en-GB' THEN 1 ELSE 2 END
于 2013-04-15T16:48:22.223 回答
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]);
}

它按预期工作,但需要将整个表返回到应用层进行分页,这不是很理想。还有其他建议吗?

于 2013-04-15T17:29:54.463 回答