c# - LINQ:显示空列表的结果

标签 c# linq

我在 C# 中创建了两个实体(简化):

class Log {  
    entries = new List<Entry>();

    DateTime Date { get; set; }  
    IList<Entry> entries { get; set; }  
}  

class Entry {  
    DateTime ClockIn { get; set; }  
    DateTime ClockOut { get; set; }  
}  

我正在使用以下代码来初始化对象:

Log log1 = new Log() {
    Date = new DateTime(2010, 1, 1),                
};
log1.Entries.Add(new Entry() {
    ClockIn = new DateTime(0001, 1, 1, 9, 0, 0),
    ClockOut = new DateTime(0001, 1, 1, 12, 0, 0)
});

Log log2 = new Log()
{
    Date = new DateTime(2010, 2, 1),
};

下面的方法用于获取日期日志:

var query =  
    from l in DB.GetLogs()
    from e in l.Entries  
    orderby l.Date ascending  
    select new  
    {  
        Date = l.Date,  
        ClockIn = e.ClockIn,  
        ClockOut = e.ClockOut,  
    };  

上述 LINQ 查询的结果是:

/*
 Date        | Clock In   | Clock Out
 01/01/2010  | 09:00      | 12:00    
*/

我的问题是,重写上面的 LINQ 查询以包含我创建的第二个对象 (Log2) 的结果的最佳方法是什么,因为它有一个空列表。换句话说,我想显示所有日期,即使它们没有时间值。

预期的结果是:

/*
 Date        | Clock In   | Clock Out
 01/01/2010  | 09:00      | 12:00    
 02/01/2010  |            |            
*/

最佳答案

试试这个:

var query =  
    from l in DB.GetLogs()
    from e in l.Entries.DefaultIfEmpty()
    orderby l.Date ascending  
    select new  
    {  
        Date = l.Date,  
        ClockIn = e == null ? null : e.ClockIn,  
        ClockOut = e == null ? null : e.ClockOut,  
    };

参见 docs for DefaultIfEmpty了解更多信息。

编辑:您可能只想更改它以在内存中执行最后一部分:

var dbQuery =  
    from l in DB.GetLogs()
    from e in l.Entries.DefaultIfEmpty()
    orderby l.Date ascending  
    select new { Date = l.Date, Entry = e };

var query = dbQuery.AsEnumerable()
                   .Select(x => new { 
                        Date = x.Date,
                        ClockIn = x.Entry == null ? null : x.Entry.CLockIn,
                        ClockOut = x.Entry == null ? null : x.Entry.CLockOut
                    });

关于c# - LINQ:显示空列表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588415/

相关文章:

c# - 如何在 C# 中从 OpenStreetMap 边界关系创建一个或多个多边形?

mysql - 如何为 linq 对象制作扁平化函数(Linq To Entities for mysql)?

c# - 如何使用 linq 解析字典列表 (List<Dictionary<string, string>>)

c# - 在单个对象上实现 linq 的 Cast<T>()

c# - 使用 LINQ,获取导航属性的前 x 行的方法是什么?

c# - 我怎样才能制作一个 pictureBox,当点击它时,它会在标签上显示一些文本?

c# - 异步 TCP 服务器持有套接字但停止监听

c# - 如何使用 GDI+ 绘制圆环( donut )?

c# - 无法创建常量值 - 只有基本类型

c# - 结构图 ObjectFactory.GetAllInstances<IHandle<TEvent>>()