代码之家  ›  专栏  ›  技术社区  ›  roeland

最近日期的LINQ加入lambda

  •  0
  • roeland  · 技术社区  · 13 年前

    我正在尝试对表“Personen”和联接表“Leners”进行linq查询。
    从“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; }
    }
    
    1 回复  |  直到 13 年前
        1
  •  3
  •   MarcinJuraszek    13 年前

    您的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;
    

    查询 IQueryable<Person> 因为你在选择 Person 项目。您无法将其重新分配为 IQueryable<AnotherType> .