设置实体的值

时间:2013-10-02 11:20:00

标签: linq entity-framework entity-framework-4 entity-framework-4.1

我有一个未映射到数据库的模块,用于生成报告。

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; }
}

我生成一个查询并填写报告的一些属性(USERID,DateToCal,Name,Position,Intime),剩余属性OutTime为空。

var query = .....;

现在我想要的是查询项目(类型为Report)将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。没有出现我设定的价值。是否可以这样设置实体的值。或者我的问题是什么?

谢谢。

3 个答案:

答案 0 :(得分:0)

问题是“items”仅在foreach循环中可用,并在每次迭代结束时被丢弃。如果要保留该值,可以使用for循环,并直接在可枚举的“查询”中设置该项:

for(int index = 0; index < query.Length; ++index;)
            {
                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();
                query[index].OutTime= outtime.TimeOfDay;
            }

答案 1 :(得分:0)

首先尝试使用方法First()执行linq查询:

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).First();

                items.OutTime = outtime.TimeOfDay;
            }

答案 2 :(得分:0)

请参阅此topic这是因为foreach旨在迭代容器,确保每个项目只访问一个,而不更改容器,以避免令人讨厌的副作用。