假设在表格中搜索条目时遇到性能问题。我们来举个例子:
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)搜索,即使实体位于本地缓存中)。但是,我怀疑使用字符串作为主键会影响我的数据库的性能并增加索引文件的大小。
有人可以就如何克服这种情况给我一个建议吗?
答案 0 :(得分:0)
如果您担心使用Entity Framework实现高性能,则需要禁用更改跟踪,并且不要使用LINQ或LINQ方法语法。更改跟踪是一个很大的麻烦制造者,并且使用传统循环而不是LINQ 大约快2倍,但是我们只谈到了在LINQ上优先选择传统循环时单个查找操作的缩短毫秒数。 / p>