2017-01-02 9 views
2

Entity Frameworkで内部結合を使用していくつかのレコードを削除する必要があります。Entity Frameworkで内部結合を使用して削除または更新する方法

例えば、私はUserRoleUserRoleMappingのテーブルを持っている:

User => Id, Name 
Role => Id, Name 
UserRoleMapping => Id, UserId, RoleId 

今、私は私のようにクエリを発射する必要がID = 2

と役割に属しているユーザーを削除する必要があります以下に示す

Delete user 
from User 
inner join UserRoleMapping on User.Id = UserRoleMapping.UserId 
where UserRoleMapping.RoleId = 2 

これはEntity Frameworkで可能ですか?

+0

を見つけます操作の種類はhttps://github.com/zzzprojects/EntityFramework-Plusをチェックする価値があります。 –

答えて

0

EFでは、最初にエンティティを読み込み、項目を選択してからDeleteObjectを呼び出す必要があります。

using (var context = new YourContext()) 
{ 
    var item = (from user in context.User 
    join userRoleMapping in context.UserRoleMapping on user.Id equals userRoleMapping.UserId 
    where userRoleMapping.RoleId == 2 
    select user).ToList().ForEach(context.User.DeleteObject); 


    context.SaveChanges(); 
} 

注:コンテキスト内で削除されたよう

ObjectContext.DeleteObject(entity)は、エンティティをマークあなたは好きでそれを行う必要があります。 (その後EntityStateが削除されます)SaveChangesを後で呼び出すと、EFはSQL DELETEステートメントをデータベースに送信します。データベースには、参照制約が違反されていない場合は、エンティティが削除され、それ以外の場合は例外が

または

using (var context = new YourContext()) 
{ 
    var items = (from user in context.User 
    join userRoleMapping in context.UserRoleMapping on user.Id equals userRoleMapping.UserId 
    where userRoleMapping.RoleId == 2 
    select user).ToList(); 

    foreach (var item in items) 
    { 
     context.Entry(item).State = EntityState.Deleted; 
    } 

    context.SaveChanges(); 
} 

またはExecuteStoreCommandを使用してスローされ、ここであなたは、このためにmore

using (var context = new YourContext()) 
{ 
    context.ExecuteStoreCommand("DELETE FROM USER INNER JOIN USERROLEMAPPING ON USER.ID = USERROLEMAPPING.USERID WHERE USERROLEMAPPING .ROLEID = {0}", customId); 
} 
+0

ユーザーのリストがありますが、次のクエリではレコードは1つだけ削除されます。 –

+0

@GopinathNavaneethan selectからすべての項目を削除して更新を確認します。 –

+0

上記のコードは動作しますが、パフォーマンスが低下することがあります。そのため、私はdelete :-( –

関連する問題