我正在尝试将两个列表与存在的数据和不存在的数据合并并返回两者。
基本上,当传递一个startDate和endDate时,我需要提取它们之间的月份并创建一个列表,然后调用数据库并检索数据并将其合并到第一个列表中。我成功完成了这个。但是,我需要返回整个列表而不仅仅是带有数据的月份。
startDate is 5-1-2016
endate is 7-14-2016
代码:
//Create the empty list
if (dateRange == "m")
{
List<DataObject> MonthList = new List<DataObject>();
for (DateTime dt = startDate; dt <= endDate; dt = dt.AddMonths(1))
{
var insertDate = new DateTime(dt.Year, dt.Month, dt.Day);
MonthList.Add(new DataObject
{
data_date = insertDate,
dataParam1 = 0,
dataParam2 = 0,
dataParam3 = 0,
dataParam4 = 0,
dataParam5 = 0
});
}
//Get the Data
List<DataObject> value =
dctx.QueryStoredProcedure<DataObject>("sproc",
parameters).ToList();
//合并列表
var result = value.Join(MonthList, arg => arg.data_date, arg => arg.data_date,
(x, y) =>
new DataObject
{
data_date = y.data_date,
dataParam1 = x.Calories,
dataParam2 = x.ActiveMinutes,
dataParam3 = x.Duration,
dataParam4 = x.Distance,
dataParam5 = x.Steps
}).ToList();
预期结果:
"data_date": "2016-05-01T00:00:00",
"dataParam1": 195007,
"dataParam2": 163069,
"dataParam3": 0,
"dataParam4": 0,
"dataParam5": 951087
"data_date": "2016-06-01T00:00:00",
"dataParam1": 416647,
"dataParam2": 265536,
"dataParam3": 0,
"dataParam4": 0,
"dataParam5": 1650185
"data_date": "2016-07-01T00:00:00",
"dataParam1": 0,
"dataParam2": 0,
"dataParam3": 0,
"dataParam4": 0,
"dataParam5": 0
实际结果:(07-01-2016缺失)
"data_date": "2016-05-01T00:00:00",
"dataParam1": 195007,
"dataParam2": 163069,
"dataParam3": 0,
"dataParam4": 0,
"dataParam5": 951087
"data_date": "2016-06-01T00:00:00",
"dataParam1": 416647,
"dataParam2": 265536,
"dataParam3": 0,
"dataParam4": 0,
"dataParam5": 1650185
我确信它在合并中,但我也试图尝试进行GroupJoin但是我无法使用对象属性填充y值。我显然做错了什么。
答案 0 :(得分:2)
使用外连接,它将返回第一组的所有结果,并尽可能匹配,在第二组中找不到匹配项的空值。
var result = (from month in MonthList
join v in value on month.data_date equals v.data_date into vg
join v in vg.DefaultIfEmpty()
select new DataObject
{
data_date = month.data_date,
dataParam1 = v?.Calories ?? 0,
dataParam2 = v?.ActiveMinutes ?? 0,
dataParam3 = v?.Duration ?? 0,
dataParam4 = v?.Distance ?? 0,
dataParam5 = v?.Steps ?? 0
}).ToList();
那就是说,这似乎是一种非常奇怪的做事方式。您应该在表示层中处理缺少的月份。
答案 1 :(得分:0)
您需要一个十字路口,而不是一个连接
list.Intersect(otherList);