如何设置实体的值

时间:2013-10-03 07:00:30

标签: c# linq entity-framework entity-framework-4.1

我的模块没有映射到数据库(sql server),仅用于生成报告。

public class Report
{
    public int USERID { get; set; }
    public DateTime DateToCal { get; set; }
    public string Name { get; set; }
    public string Position { get; set; }
    public TimeSpan? Intime { get; set; }
    public TimeSpan?  OutTime { get; set; }
}

我生成一个查询并填充Report的一些属性(USERID,DateToCal,Name,Position,Intime),并且Report的某些属性保持为null(如OutTime is null

var query = .....;

现在我想要对查询项(类型为Report)进行迭代,并将null属性OutTime的值设置为

foreach(var items in query)
            {
                var outtime= from x in con.CHECKINOUTs
                              where x.USERID == items.USERID && EntityFunctions.TruncateTime(x.CHECKTIME) == EntityFunctions.TruncateTime(items.DateToCal && x.CHECKTYPE == "O"
                              select x.CHECKTIME
                              .Single();
                items.OutTime= outtime.TimeOfDay;
            }

现在的问题是,在鼠标悬停到items.OutTime时,在foreach中会出现值,但如果我从foreach和mousehover转到query,则仍有OutTime is null。没有出现我设定的价值。是否可以这样设置实体的值。或者我的问题是什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

在迭代之前在本地保存查询结果:

 var query = ....ToList();

在您的情况下,查询执行两次 - 第一次更新OutTime属性时,第二次迭代查询项(查看调试器或在UI中显示)。因此,当第二次执行查询时,您会看到全新的对象集作为查询结果(原始null值为OutTime)。

BTW考虑使用单个JOIN查询,而不是对主查询中的每个项目进行单独的outtime查询。

答案 1 :(得分:0)

尝试使用以下代码:

public class Report
{
    public int USERID { get; set; }
    public DateTime DateToCal { get; set; }
    public string Name { get; set; }
    public string Position { get; set; }
    private TimeSpan? _intime;
    public TimeSpan Intime {
        get { return _intime ?? new TimeSpan(0); }  
        set { _intime = value; }
    }
    private TimeSpan? _outTime;
    public TimeSpan OutTime
    {
        get { return _outTime ?? new TimeSpan(0); }
        set { _outTime = value; }
    }
}