假设:
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后,有没有办法避免清空表?
答案 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();
这是预期的行为。
如果你想“获取”电子邮件,对它们做一些事情并保留该集合,你应该把它们放在列表/数组中。枚举不是真正的集合,它更像是一个在查询时返回集合的函数。