如何编写这个LINQ(或SQL)查询?

时间:2013-04-15 16:35:34

标签: database linq tsql

我有两张这样的表:

  

新闻

     

编号

     

标题

     

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

     

......剩下的语言中的其他新闻......

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

3 个答案:

答案 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]);
}

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