【问题标题】:LINQ join in lambda with most recent dateLINQ 以最近的日期加入 lambda
【发布时间】:2013-03-29 12:34:48
【问题描述】:

我正在尝试对表“Personen”进行 linq 查询并加入表“Leners”。
如果有的话,我想从表 'Leners' 中获取最新的项目。

在 SQL 中,我会这样做:

select p.*, l.* 
from dbo.Personen p
left outer join dbo.Leners l on l.LenerId = 
    (select top 1 LenerId 
     from dbo.Leners lt
     where lt.PersoonId = p.PersoonId 
     order by lt.Vanaf desc)

我怎样才能用 linq 做到这一点? 我想在 lambda 表达式中执行此操作,因为它取决于选择。

using (var db = new DbContext())
{
    var query = from p in db.Personen                        
                select p;

    if (someSelection != null)
    {
        query = ?
    }
}

这些是表格:(EF 代码在前)

[Table("Personen")]
public class Persoon
{
    [Key]
    public int PersoonId { get; set; }

    [StringLength(50)]
    [Required]
    public string Naam { get; set; }
}

[Table("Leners")]
public class Lener
{
    public int LenerId { get; set; }

    public int? PersoonId { get; set; }

    [ForeignKey("PersoonId")]
    public virtual Persoon Persoon { get; set; }

    public DateTime Vanaf { get; set; }
}

【问题讨论】:

    标签: c# linq entity-framework lambda ef-code-first


    【解决方案1】:

    您的 LINQ 查询应如下所示:

    var query2 = from p in dbo.Personen
                 let l = dbo.Leneren
                            .OrderByDescending(lt => lt.Vanaf)
                            .FirstOrDefault(lt => lt.PersoonId == p.PersoonId)
                 select new { p, l }
    

    但是,您不能将其分配回您的 query 变量!

    var query = from p in db.Personen                        
                select p;
    

    queryIQueryable<Person>,因为您在此处选择 Person 项目。您不能将其重新分配为 IQueryable<AnotherType>

    【讨论】:

    • 如果我将 Lener 类型的额外属性添加到 Person(未映射到数据库),是否有可能?
    • 我该怎么做? (在 lambda 中)
    • 我在 linqpad 中尝试了您的第一个查询。它有效,但它真的很慢。 (很多 sql 语句而不是一个)
    • 你不应该依赖 linqpad。在实际应用中尝试一下。
    • @Roeland 您可能没有链接到 Linqpad 中的 EF 上下文。在 linq to sql 中(在 linqpad 中默认)这样的查询可能会导致 n+1 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多