假设在表中搜索条目时出现性能问题。我们来看一个例子:
public class A {
[Key]
public int Id {get;set;}
public string xyz {get; set;}
}
public class Context : DbContext {
public DbSet<A> AList {get;set;}
public A FindA(string xyz) {
A output = null;
if(AList.Local != null) {
output = AList.Local.SingleOrDefault(x=>x.xyz==xyz);
}
return output ?? AList.SingleOrDefault(x=>x.xyz==xyz);
}
}
FindA 方法首先在 Local 集合中查找,如果没有匹配,则转到数据库。我需要这种方法来避免重复插入元素。
这种方法的问题很简单:在 AList.Local 上的搜索具有 O(n) 复杂性,在我的例子中, AList.Local 通常大于 100,000 条记录。如果 AList.Local 是在 xyz 属性上索引的字典,那就太好了;但是,EF Code First IDbSet 使用完全没有索引的 ObservableCollection。
一种可能的解决方案是维护一个 Dictionary 作为 AList.Local 的镜像。但是,这很棘手,因为对 AList.Local 的更改不容易跟踪。
另一种解决方案是将 xyz 属性作为主键并使用 AList.Find(xyz) 方法(我希望它是 O(1) 搜索,即使实体在本地缓存中)。但是,我怀疑使用字符串作为主键会影响我的数据库的性能并大大增加索引文件的大小。
谁能给我一个关于如何克服这种情况的建议?