将SQL语句转换为LINQ

时间:2016-01-20 17:41:17

标签: sql entity-framework linq

我需要创建一个与这个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”,然后按名称排序......

0 个答案:

没有答案