我有两张这样的表:
新闻
编号
标题
LanguageId
语言表:
语言
编号
名称
ISDEFAULT
现在使用LanguageId作为参数(例如en-US),默认语言是en-GB,我希望得到这样的值:
新闻
Id 标题 LanguageId
1 1 en-US
2 2 en-US
......剩下的美国新闻......
10 10 en-GB
11 11 en-GB
...剩下的en-GB新闻,因为en-GB是默认的......
20 20 fr-FR
21 21 fr-FR
......剩下的语言中的其他新闻......
目前的解决方案是使用临时表和游标来获取每种语言的新闻。有没有更好的方法呢?
答案 0 :(得分: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 }
答案 1 :(得分:0)
您可以在tsql中使用order by语句,如下所示。
ORDER BY CASE LanguageId WHEN 'en-US' THEN 0 WHEN 'en-GB' THEN 1 ELSE 2 END
答案 2 :(得分: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]);
}
它按预期工作,但它需要将整个表返回到应用程序层进行分页,这不是非常有效。还有其他建议吗?