Linq-To-SQL在空表中选择,更新和提交结果

时间:2011-08-11 02:23:09

标签: linq-to-sql select

假设:

using (DataContext ctx = new DataContext(props.ConnectionString))
{
    IQueryable<Email> emails = null;
    try
    {
       emails = ctx.Emails.Where(e => !(e.IsLocked || e.IsSent));
       foreach (var e in emails)
       {
           e.IsLocked = true;
       }
       ctx.SubmitChanges();
    }
}

// do something with emails here

为什么在SubmitChanges()之后电子邮件是空的?在IsLocked设置为true后,有没有办法避免清空表?

2 个答案:

答案 0 :(得分:2)

ctx.Emails可能不是空的。每次调用时都会对集合emails进行评估。

如果您想在初始通话中保留电子邮件,则可以执行此操作:

emails = ctx.Emails.Where(e => !(e.IsLocked || e.IsSent)).ToList().AsQueryable();

答案 1 :(得分:1)

托马斯的回答是正确的,但我也会去解释它。

emails集合是一个枚举,在您调用它时会重新评估。想象它。

// another method...
IEnumerable<Email> GetEmails()
{
    return ctx.Emails.Where(e => !(e.IsLocked || e.IsSent));
}

// & inside your main method
foreach (var e in GetEmails())
{
    e.IsLocked = true;
}
ctx.SubmitChanges(); 

// now if you check the result it will be reevaluated
GetEmails();

这是预期的行为。

如果你想“获取”电子邮件,对它们做一些事情并保留该集合,你应该把它们放在列表/数组中。枚举不是真正的集合,它更像是一个在查询时返回集合的函数。