使用Lambda表达式在LINQ中执行1对1左外连接

时间:2016-03-15 18:27:58

标签: c# linq join lambda left-join

我有以下LINQ查询:

dbContext.NAVSummaries
        .Join(dbContext.NAVSummaries.DefaultIfEmpty(),
                current => new
                {
                    current.Portfolio,
                    PD = SqlFunctions.DatePart("dw", current.ValueDate) == 2 ? DbFunctions.AddDays(current.ValueDate, -3).Value :
                            SqlFunctions.DatePart("dw", current.ValueDate) == 1 ? DbFunctions.AddDays(current.ValueDate, -2).Value :
                                                                                DbFunctions.AddDays(current.ValueDate, -1).Value
                },
                previous => previous == null ? null : new { previous.Portfolio, PD = previous.ValueDate },
                (outer, inner) => new { outer, inner }
        )
        .Where(n => !dateStart.HasValue || n.outer.ValueDate.CompareTo(dateStart.Value) >= 0)
        .Where(n => !dateEnd.HasValue || n.outer.ValueDate.CompareTo(dateEnd.Value) <= 0)

给定ValueDate有x个记录,并且上一个营业日期有x-1个记录。 NAVSummaries DbSet在ValueDate列上自行连接,ValueDate项与其上一个营业日期匹配。但是,输出结果只计算x-1。我希望执行左外连接,以便返回左表/集合的所有x记录。

编辑:只有一个记录/项目与上一个营业日期相匹配。所以它必须是一对一的映射。

NavSummary实体:

public class NAVSummary
    {
        [Key, Column(Order = 0)]
        public string Portfolio { get; set; }
        [Key, Column(Order = 2)]
        public DateTime ValueDate { get; set; }
        public decimal BackOfficeNAV { get; set; }
        public decimal FrontOfficeNAV { get; set; }
        public decimal DifferencePercent { get; set; }
        public decimal Threshold { get; set; }
        public int ExtractId { get; set; }
        public string ExtractStatus { get; set; }
        public string PortfolioOwner { get; set; }
        public DateTime DateTimeModified { get; set; }
        public int MostCorrectNAV { get; set; }
        public virtual IList<NAVComment> Comments { get; set; }
        public virtual IList<NAVStatus> Statuses { get; set; }
        public virtual IList<NAVExtract> Extracts { get; set; }
        [JsonIgnore]
        [NotMapped]
        public bool IsChange { get; set; }
        [NotMapped]
        public decimal DayOverDayChange { get; set; }
        [JsonIgnore]
        [NotMapped]
        public DateTime PreviousValueDate { get; set; }
        [JsonIgnore]
        [NotMapped]
        public decimal PreviousDP { get; set; }
    }

1 个答案:

答案 0 :(得分:1)

在处理复杂查询(包括连接,分组等)时,我建议您对大多数部分使用LINQ查询语法,因为透明标识符和{{1}更加自然和可读表达式。这里描述了不同的类型连接join clause (C# Reference)

以下是使用查询语法的查询:

let
相关问题