我需要创建一个与这个SQL语句相同的LINQ语句,但我无法解决它......
SELECT l.Id, l.Url, t.Name, t.LanguageCode
FROM link l
LEFT OUTER JOIN linktr t ON t.Id = (SELECT tt.Id FROM linktr tt WHERE tt.LinkId = l.Id AND (tt.LanguageCode = 'en-EN' OR tt.LanguageCode = 'es-ES') ORDER BY (tt.LanguageCode = 'en-EN') DESC, tt.LanguageCode LIMIT 1)
ORDER BY l.OrderPos
Table Link
Id, Url
Table LinkTr
Id, LinkId, Name, LanguageCode
表格链接包含链接的网址,而LinkTr包含该名称,并且可以包含多种语言
我想选择我们在链接数据库中的所有链接以及我想要显示JUST ONE语言的每个链接,如果存在,则对应于当前语言,但是如果它不存在,我必须显示与默认语言对应的那个。如果没有人存在,则不会显示该记录。
对于此示例,默认语言为es-ES,当前的语言为en-EN。
如何使用LINQ执行此操作?
提前致谢
修改
如果我使用这个LINQ表达式,只有当我对ORDER行进行注释,但没有ORDER行(.OrderBy(p3 => p3.LanguageCode == currentLanguage))时它才会有效。它会通过Id获取数据库中的第一条记录,但不是现在的语言。
var queryString = from i in _dbContext.Links
let p = _dbContext.LinksTrs.Where(p2 => i.Id == p2.LinkId && (p2.LanguageCode == currentLanguage || p2.LanguageCode == defaultLanguage))
.OrderBy(p3 => p3.LanguageCode == currentLanguage)
.FirstOrDefault()
orderby i.OrderPos
select new LinksWebListModel
{
Id = i.Id,
Name = (p == null) ? "" : p.Name,
Url = i.Url,
Summary = (p == null) ? "" : p.Summary,
};
编辑2
我在起诉EF6和我的实体,我无法改变,是这些:
public class Link : EntityBase
{
public int Id { get; set; }
public int OrderPos { get; set; }
public string Url { get; set; }
public virtual IEnumerable<LinkTr> Translations { get; set; }
}
public class LinkTr
{
public int Id { get; set; }
public string Name { get; set; }
public string LanguageCode { get; set; }
public int LinkId { get; set; }
public virtual Link Link { get; set; }
}
编辑3
会是这样的......
var queryString = (from entity in _dbContext.Links
let translation = _dbContext.LinksTrs
.Where(p2 => p2.LinkId == entity.Id)
.Where(p3 => p3.LanguageCode == currentLanguage || p3.LanguageCode == defaultLanguage)
.OrderBy(p4 => p4.LanguageCode)
.FirstOrDefault()
orderby entity.OrderPos descending
select new LinksWebListModel()
{
Id = entity.Id,
Name = translation.Name,
Url = entity.Url,
Summary = translation.Summary,
});
这里的问题是2: - 只有在子查询中有一行(LinksTrs)时才需要返回记录(链接) - 此外,我需要首先通过“currentLanguage”订购子查询,然后“defaultLanguage”,然后是其余的。如果我将其添加到子查询中,我会收到错误:
.OrderBy(p4 => p4.LanguageCode == currentLanguage)
.ThenBy(p5 => p5.LanguageCode == defaultLanguage)
.ThenBy(p6 => p6.LanguageCode)
您是否了解如何按特定值排序,例如,如果我将这些语言设为“es-ES”,“en-EN”,“it-IT”,“fr-FR”,例如首先是“it-IT”,然后是“es-ES”,然后按名称排序......