2016-03-15 124 views
0

我有以下LINQ查询:执行1对1的左外连接在LINQ使用Lambda表达式

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; } 
    } 
+0

可以显示类? –

+0

@LucianBumb,添加了NavSummary实体类 – Lucifer

+0

它有点令人困惑,为什么你要尝试使用LEFT JOIN,在一个实体内部,你能显示你想要这个查询的结果吗? –

回答

1

当复杂的查询包括联接,通过等组,我想你使用LINQ查询语法对于大部分零部件的建议,因为它更自然,更可读的处理,由于透明标识符和let表达式。这里描述了不同类型的连接join clause (C# Reference)

下面是使用您的查询的查询语法:

var query = 
    from current in db.NAVSummaries 
    let currentWD = SqlFunctions.DatePart("dw", current.ValueDate) 
    let currentPD = DbFunctions.AddDays(current.ValueDate, currentWD == 2 ? -3 : currentWD == 1 ? -2 : -1).Value 
    join previous in db.NAVSummaries 
    on new { current.Portfolio, PD = currentPD } 
    equals new { previous.Portfolio, PD = previous.ValueDate } 
    into previousGroup 
    from previous in previousGroup.DefaultIfEmpty() // LEFT OUTER JOIN 
    select new { outer = current, inner = previous }; 
if (dateStart.HasValue) 
    query = query.Where(e => e.outer.ValueDate >= dateStart.Value); 
if (dateEnd.HasValue) 
    query = query.Where(e => e.outer.ValueDate <= dateEnd.Value); 
+0

感谢您为我重写查询。那工作:) – Lucifer