2017-04-10 77 views
1

我有一個使用linq刪除查詢下面的代碼。但它感覺像一個很長的方法?有沒有其他方法可以做到這一點?在LINQ中更短的刪除查詢

var ListOfData = (from a in db.Table1 
        join b in db.Table2 on a.Table1Id equals b.Table2Id 
        where a.Table1Id == (param) select a) 
        .ToList(); 

foreach(var item in ListOfData) 
{ 
    var DelRecord = (from a in db.Table1 
        join b in db.Table2 on a.Table1Id equals b.Table2Id 
        where a.Table1Id == item.TableId select a) 
        .FirstOrDefault(); 

    db.Table1.DeleteObject(DelRecord); 
    db.SaveChanges(); 
    } 
+0

爲什麼你沒有創建適當的實體?如果它們是可連接的,那麼可以在Entity對象中創建一個鏈接,以便引用Table1.table2.whatever。 – Worthy7

+0

是否需要每次迭代保存更改? –

+0

不應該在Code Review SE論壇上[移植]? –

回答

3

您可以刪除第二個查詢,你已經擁有你所需要的數據。

var ListOfData = (from a in db.Table1 
        join b in db.Table2 on a.Table1Id equals b.Table2Id 
        where a.Table1Id == (param) select a) 
        .ToList(); 

foreach(var item in ListOfData) 
{ 
    db.Table1.DeleteObject(item); 
} 
db.SaveChanges(); 

如果您使用實體框架6,他們已經推出了RemoveRange()方法。

var ListOfData = (from a in db.Table1 
        join b in db.Table2 on a.Table1Id equals b.Table2Id 
        where a.Table1Id == (param) select a) 
        .ToList(); 

db.Table1.RemoveRange(ListOfData); 
db.SaveChanges(); 
+0

它對我的權利還是一樣嗎?並且使用長碼 – KiRa

+2

關於EF6的好處。顯然_「[請注意,如果AutoDetectChangesEnabled設置爲true(這是默認值),那麼DetectChanges將在調用一次之前被調用,並且不會再被調用,這意味着在某些情況下** RemoveRange可能會顯着優於調用刪除**多次會做](https://msdn.microsoft.com/en-us/library/system.data.entity.dbset.removerange(v = vs.113).aspx)「_。太好了! +1 – MickyD

+0

我沒有'RemoveRange'。如何檢查我正在使用的EF? – KiRa