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

Linq, lambda expression

下面的代码应该可以修复它:

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已经为你删除了外键关系-你确定它没有吗?