2015-10-05 65 views
0

我试图用这个sample左外LINQ的加入不DefaultIfEmpty

我要的是唯一的回报:'the书使用id = 2

new Book{BookID=2, BookNm=".NET and COM for Newbies"}, 

我想只有那些没有订单的书。

当我删除DefaultIfEmpty()它也不起作用。

UPDATE

Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" }; 
      Person terry = new Person { FirstName = "Terry", LastName = "Adams" }; 
      Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" }; 
      Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" }; 

      Pet barley = new Pet { Name = "Barley", Owner = terry }; 
      Pet boots = new Pet { Name = "Boots", Owner = terry }; 
      Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte }; 
      Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry }; 
      Pet daisy = new Pet { Name = "Daisy", Owner = magnus }; 

      // Create two lists. 
      List<Person> people = new List<Person> { magnus, terry, charlotte, arlene }; 
      List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy }; 

      var query = from person in people 
         join pet in pets on person equals pet.Owner into gj      
         where !gj.Any() 
         select person; 

我只是尝试这样的代码,它似乎它的作品!

我退回了人阿琳她没有宠物!

有人可以证实这是一种已知的方法吗?我刚发明它LOL

+0

你的代码在哪里? –

+0

它与我粘贴的链接相同的代码...在我看来,这个链接没有提供真正的左连接。我只想在没有订单的情况下退还书籍。 – Elisabeth

+0

看到我的更新! ... – Elisabeth

回答

1

你误解了左连接的工作原理。 a LEFT JOIN b将返回来自a的所有项目,无论它们是否具有b中的匹配项目。如果我正确理解您的问题,则根本不需要加入,因为您不需要bookOrders的任何其他数据。你可以使用LINQ的All扩展方法:

var query = bookList.Where(b => bookOrders.All(o => o.BookId != b.BookId).ToList(); 

这将返回其没有一本书订单包含该书的ID的所有书籍。我将这些名称放在链接的文章上。

+0

是的,关于左连接工程我错了,但你是对的。 – Elisabeth