2017-04-10 53 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