2016-04-22 16 views
4

私は単純なエンティティを持っています。Entity Framework、以前にこのエントリを追加しましたか?

public partial class Thing 
{ 
    public Thing() 
    {} 

    public int Id { get; set; } 
    public string Name { get; set; } 
} 

私はlocalDBデータベースに何千もの新しいエントリを挿入していますが、ちょっとしたものしかありません。 挿入するたびにSaveChangesを実行すると非常に遅くなりますが、SaveChangesを実行しないと、newThing.Nameがすでに存在するかどうかを判断できません。 できますか?私は何かが文脈に存在するかデータベース対前/後SaveChangesであるかをチェックするのはかなり霧がかかっています。誰も私のためにこれを明確にすることはできますか?

Thing newThing = new Thing(); 
newThing.Name = "MyName"; 

context.Things.Add(d); 

//returns null 
Thing myFirstThing = context.Things.FirstOrDefault(c => c.Name == newThing.Name); 

//returns false 
if (context.Detectors.Any(c => c.Name == newThing.Name)) 
{ //do some stuff} 

答えて

0

おそらく、あなたのDbContextのChangeTrackerでこれを行うことができますが、おそらく遅いでしょう。

//(warning: free-handing this): 
myContext.ChangeTracker.Entries<theEntityType>().Any(e => e.State == EntityState.Added && e.Entity.TheField == yourString); 

私は近いものが働くだろうと(あるいは考えていますが、それぞれの呼び出しで、コレクションをスキャンしているとして、それは、非常に遅くなる可能性があり、それぞれが追加した後(それは少し遅くなるだろう - 1000年代のコレクションを

代わりに、エンティティを辞書 yourString、theEntity >に追加して追加することができます。辞書のキーベース検索はO(1)です。辞書に何百万ものエントリがある場合、ルックアップは非常に高速です。メモリを軽くしておくと、エンティティを保存するときに辞書を消去してください。

+0

応答をありがとう。私はあなたの辞書のアイデアに行くと思います。唯一の400ishユニークなエントリがあります。私はおそらくリストを使用します。 – kurgaan

+1

@kurgaan喜んで助けてください。リストを使用すると、辞書のパフォーマンスは得られません。リストを検索すると、リストをループするだけです。ディクショナリやハッシュセットを使用している場合、単純なループは行われません。索引があるとよく似ているため、ルックアップではるかに優れたパフォーマンスが得られます。 – JMarsch

関連する問題