如何从方法调用中替换linq对象

时间:2009-02-25 16:48:52

标签: c# .net linq-to-sql

我有一个linq对象,当某些方面发生变化并调用Save()方法时,我想“退休”。数据库通过使用Terminated列来执行此操作,该列在设置时会导致在后续查询中忽略该对象。我想透明地这样做,例如:

DataContext db = new DataContext();
Foo bar = (from a in db.table
           where a.pk == somevalue
           select a).Single();

bar.Price += 2;
Console.WriteLine(bar.pk);
bar.Save();
Console.WriteLine(bar.pk);

第二个WriteLine()应该是与第一个不同的键,因为在保存过程中我创建了一个重复的对象并用它替换了它。基本上在save方法中我想设置this = newObj;。我想要的是什么,还是以错误的方式解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果通过引用传递引用,则可以更改引用(或更准确地说是包含它们的变量):

class Foo {
  ...
  public static void Save(ref Foo obj)
  {
    var newObj = obj._save() //your implementation
    obj = newObj;
  }
}

没有其他方法可以更改引用。原因是,对象不知道它们被引用的位置。 Foo对象不知道对它的任何引用。

如果您想要在代码中列出的确切行为,实现此目的的唯一方法是更改​​Foo实例的内容,即使用更新的值覆盖每个字段。

希望这有帮助。

答案 1 :(得分:0)

另一种方法是从Save()方法返回新对象;如果Save()方法不是对象的一部分,这可能更有意义。例如:

var dataPersister = new DataPersister();
var obj = dataPersister.Load(somevalue);
obj.Price += 2;
var newObj = dataPersister.Save(obj);

在这些调用之后,obj仍将指向原始对象,newObj将是保存后的结果。