2016-12-25 3 views
1

エンティティUserプライマリキーのプロパティがUCOのエンティティがあります。Entity Frameworkの入力リストからDBに既存のエンティティを追加しないでください

AddUsersというメソッドを書いて、与えられたリストのすべてのユーザーをデータベースに追加したいと思います。問題は、管理者が既にデータベースに存在するユーザーであるリストを追加しようとすると、例外がスローされることです。データベースに含まれていないだけで、ユーザーを追加します

私のソリューションはここにある:

public void AddUsers(List<UserDTO> users) 
{ 
    using (var db = new AppDbContext()) 
    { 
     var existingUsers = Mapper.Map<List<UserDTO>>(db.Users.ToList()); 

     db.Users.AddRange(
       Mapper.Map<List<User>>(users 
        .Where(user => !existingUsers 
         .Select(u => u.UCO) 
         .Contains(user.UCO)))); 
     db.SaveChanges(); 
    } 
} 

私はいくつかのより効果的な解決策があるかどうかをお尋ねしたいと思います。私は10,000ユーザーを持っていた場合、これは非常に遅いだろう...

は答えてくれてありがとう:)

+0

潜在的にどれが大きいのでしょうか? 'existingUsers'、 'users'、またはその両方? –

+0

既存ユーザーは潜在的に大きい – MacakM

答えて

1

usersリストがとても大きくなることが予想されていない場合、あなたが潜在的に大きなをロード避けることができますexistingUsers少なくとも2つの方法でリストします。

まず、usersリスト(SO完全users.Countクエリ)の各項目ごとに単一のDBクエリを実行し

using (var db = new AppDbContext()) 
{ 
    db.Users.AddRange(Mapper.Map<List<User>>(users 
     .Where(user => !db.Users.Any(u => u.UCO == user.UCO)))); 
    db.SaveChanges(); 
} 

第二に、よりアイテムのUCOのサブセットを検索するための単一のDBクエリを実行しますデータベースに存在するusersリスト、[追加]からそれらを除くためにそれを使用します。

using (var db = new AppDbContext()) 
{ 
    var userUCOs = users.Select(u => u.UCO); 
    var existingUserUCOs = new HashSet<int>(db.Users 
     .Where(u => userUCOs.Contains(u.UCO)) 
     .Select(u => u.UCO)); 
    db.Users.AddRange(Mapper.Map<List<User>>(users 
     .Where(u => !existingUserUCOs.Contains(u.UCO)))); 
    db.SaveChanges(); 
} 

UCOタイプがintでない場合は、ちょうどを使用します)

関連する問題