Linq, lambda expression
本文关键字:expression lambda Linq | 更新日期: 2023-09-27 18:12:13
我有一个具有"多对多"关系的数据库。我正在尝试用lambda和linq来删除多对多表中的一个条目。
我有一个ado实体叫Book
,另一个叫Author
。Book包含导航属性Authors
, Author
包含导航属性Books
。
现在我想从数据库中删除一本书。要做到这一点,我必须在AuthorBooks
表中删除它的外键,然而这被证明是困难的。
这是我当时的语法:
var a = db.db.Authors.Select(c => db.db.Authors.Where(c.Books.Contains(book));
这是不被Visual studio接受的,我不知道如何到达我想要的地方。提前感谢!
图片来自我的错误:
http://olofd.dyndns.org: 8887/pic1.PNG
http://olofd.dyndns.org: 8887/pic2.PNG
http://olofd.dyndns.org: 8887/pic3.PNG
下面的代码应该可以修复它:
book = db.Books.Single(b => b.BookId == book.BookId);
var bookCopies = db.BookCopies.Where(c => c.BookId == book.BookId).ToList();
foreach (BookCopy c in bookCopies)
{
db.BookCopies.DeleteObject(c);
}
var authors = db.Authors.Include("Books").Where(author => author.Books.Any(b => b.BookId == book.BookId)).ToList();
foreach (Author a in authors)
{
a.Books.Remove(book);
}
db.DeleteObject(book);
db.SaveChanges();
出现错误的原因是在加载作者时没有包含Books关系。因此,您可以循环浏览一个作者集合,其中每个作者都没有书。
您可以看到,当您检查db.ObjectStatemanger时发生了这种情况。您正在删除实体,但状态管理器中没有显示任何内容。
您还需要向查询添加一个ToList()。否则,您将从同一集合中删除实体,因为您正在迭代,这将抛出一个异常。
似乎你指定的东西太多太多了。我希望它看起来像:
var authors = db.Authors.Where(author => author.Books.Contains(book));
老实说,我希望当你删除实体时,LINQ已经为你删除了外键关系-你确定它没有吗?