我尝试加入代表db表的类和另一个返回日期系列的类静态函数。我的代码正在运行,但我没有得到理想的价值。
类MyData
有一些缺少的日期和我的静态函数返回日期。如果在MyData
中找不到日期静态函数返回,那么我想为该行返回EAmount field
的零值。如果在MyData
中找到返回静态函数的日期的数据,那么我将返回EAmount
实际值。
[Table("MyData")]
public partial class MyData
{
public int ID { get; set; }
public DateTime? EDate { get; set; }
public decimal? EAmount { get; set; }
public DateTime? AddDate { get; set; }
public DateTime? ModDate { get; set; }
}
我的要求就像是我在两张桌子之间离开了。
假设表1有日期,表2有日期和金额。加入将基于日期。如果表2中的日期与表1中的日期没有匹配日期那么我想显示表1日期和零作为值,但如果日期匹配,那么我将从表1中获取日期和表2中的数量。这是我的简单要求我试图通过EF加入EF实体表和静态函数来做。
所以这里静态函数将扮演table1和EF实体类扮演table2的角色。
这是我的完整代码。代码执行但问题是EAmount value
始终为零。
[Table("MyData")]
public partial class MyData
{
public int ID { get; set; }
public DateTime? EDate { get; set; }
public decimal? EAmount { get; set; }
public DateTime? AddDate { get; set; }
public DateTime? ModDate { get; set; }
}
public class DateRange
{
public static List<DateTime> GetDates(DateTime startdate, DateTime enddate)
{
List<DateTime> dates = Enumerable.Range(0, (enddate - startdate).Days + 1)
.Select(day => startdate.AddDays(day)).ToList();
return dates;
}
}
public partial class LocalDbContext : DbContext
{
public LocalDbContext()
: base("name=LocalTest")
{
}
public virtual DbSet<MyData> MyDatas { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
using (var db = new LocalDbContext())
{
var result = from p in DateRange.GetDates(new DateTime(2017, 01, 01), new DateTime(2017, 01, 20))
join n in db.MyDatas on p equals n.EDate into g
from x in g.DefaultIfEmpty()
select new
{
date = p,
amount = x == null ? 0 : x.EAmount
};
var xx = result.ToList();
}
答案 0 :(得分:0)
数据不正确,因为您的日期包含时间,并且由于时间值连接无法正常工作。因此,在实现连接时,您需要排除日期的时间部分,并仅基于日期实现连接。以下是修改后的查询,以便您获取正确的数据:
using (var db = new LocalDbContext())
{
var result = from p in DateRange.GetDates(new DateTime(2017, 01, 01), new DateTime(2017, 01, 20))
join n in db.MyDatas.Where(x => x.EDate != null) on p.Date equals n.EDate.Value.Date into g
from x in g.DefaultIfEmpty()
select new
{
date = p,
amount = x == null ? 0 : x.EAmount
};
var xx = result.ToList();
}