这个getter是否会在每次引用时都进行数据库调用?

时间:2012-05-05 04:08:26

标签: c# properties getter

假设我有一个这样的课程:

public class MyClass {
...    
    public List<SomeClass> MyProperty {
        get { 
            SomeClass.GetCollectionOfThese(someId);
        } 
    }
...
}

GetCollectionOfThese()调用数据库来检索构建集合所需的记录。现在让我说我在其他地方有以下代码:

MyClass obj = new MyClass(someId);
List<SomeClass> temp = obj.MyProperty;

...

SomeClass otherObj = obj.MyProperty.FirstOrDefault(i => i.Foo == "bar");

在这种情况下,数据库被调用两次了吗?或者属性值是否缓存在内存中?

2 个答案:

答案 0 :(得分:3)

您的实施将导致多个数据库调用。如果那就是你需要的,你必须进行缓存。类似的东西:

public class MyClass {
...    

    private List<SomeClass> _myProperty = null;
    public List<SomeClass> MyProperty {
        get { 
            if (_myProperty == null) _myProperty = SomeClass.GetCollectionOfThese(someId);
            return _myProperty;
        } 
    }
...
}

当然,您可能希望为客户提供一种刷新缓存的方法。

答案 1 :(得分:1)

这取决于您在数据层中使用的技术。 例如,如果将Linq2Sql与单个DataContext一起使用,DataContext将为您缓存实体并从缓存中重新查询实体,因此您只能访问DataBase一次。但这不是一个典型的计划。