如何在Linq连接语句中添加默认空值

时间:2013-05-02 08:00:13

标签: c# linq date join

我有两个IEnumerables。一个包含日期,另一个包含数据。

DateTime start = DateTime.Today.AddDays(-21);

var dates = Enumerable.Range(0, 21).Select(n => start.AddDays(n)).ToArray();

var data = MyClass.Data.Select(x => new { Date = x.Date, Views = x.Count });

我正在尝试构建一个在给定日期显示Views的表格。但是,数据包含一些空白。如何编写连接两个集合的linq查询,并在存在时返回Views数字,或者在数据中没有匹配对象时返回0?

我可以用foreach语句的老式方式做到这一点,但我想知道如何在Linq中做到这一点。

3 个答案:

答案 0 :(得分:1)

这应该有效:

var data = from day in Enumerable.Range(0, 21).Select(n => start.AddDays(n))
           join d in MyClass.Data.Select(x => new { Date = x.Date, Views = x.Count })
           on day equals d.Date into gj
           from dd in gj.DefaultIfEmpty()
           select new { Date = day, Views = dd == null ? 0 : dd.Views };

当给定日期有一个时返回views-number,否则返回0。

How to: Perform Left Outer Joins

答案 1 :(得分:1)

我不确定我是否完全理解您的问题。如果您想生成至少包含一个视图的日期列表,那么这将完成工作。

DateTime start = DateTime.Today.AddDays(-21);

//Sample view data
var viewsData = new[] {new {id = "id", date = new DateTime(2013, 4, 12), views = 25}};

var dates = Enumerable.Range(0, 21)
                        .Select(d => start.AddDays(d))
                        .Select(n => new
                                        {
                                         Day = n,
                                         views =viewsData.Any(x => x.date == n)
                                         ? viewsData.FirstOrDefault(v => v.date == n).views
                                         : 0
                         });   

在没有视图的日子里填充零

答案 2 :(得分:0)

查看此MSDN文章:http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

它解释了如何在这种情况下进行左外连接。