C#EF:加入EF实体类和静态函数

时间:2017-03-03 09:06:49

标签: c# entity-framework left-join

我尝试加入代表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();
    }

1 个答案:

答案 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();
            }