LINQ Group By和NOT in

LINQ Group By和NOT in,linq,Linq,我有一个如下的模式(这是一个简化的示例,因此请忽略明显的模式问题): 目的是找出阅读次数少于500次的书籍。不幸的是,我不能把这一数字记在账上 我正在写这样一个查询: from book in Books where !(from student in students_books group student by student.bookId into GroupedPerStudent where GroupedPerStudent.Count() &

我有一个如下的模式(这是一个简化的示例,因此请忽略明显的模式问题):

目的是找出阅读次数少于500次的书籍。不幸的是,我不能把这一数字记在账上

我正在写这样一个查询:

from book in Books
    where !(from student in students_books
        group student by student.bookId into GroupedPerStudent
        where GroupedPerStudent.Count() >= 500 
        select new { bookname = GroupedPerStudent.Key }).Contains(book.bookid)
    select book 
我在
Contains()
上遇到编译错误。这个查询有什么问题

无法从用法推断方法“System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable,TSource)”的类型参数。尝试显式指定类型参数


如果要在嵌套查询中选择匿名类型,请将其替换为
select GroupedPerStudent.Key

   ...
   where GroupedPerStudent.Count() >= 500 
         select GroupedPerStudent.Key).Contains(book.bookid)
虽然我会重写整个查询:

var popularBooks = students_books
                      .GroupBy(b => b.bookId)
                      .Where(g => g.Count() >= 500)
                      .Join(Books, students_book => students_book.Key, b => b.bookId,
                                  (students_books, book) => book);

如果要在嵌套查询中选择匿名类型,请将其替换为
select GroupedPerStudent.Key

   ...
   where GroupedPerStudent.Count() >= 500 
         select GroupedPerStudent.Key).Contains(book.bookid)
虽然我会重写整个查询:

var popularBooks = students_books
                      .GroupBy(b => b.bookId)
                      .Where(g => g.Count() >= 500)
                      .Join(Books, students_book => students_book.Key, b => b.bookId,
                                  (students_books, book) => book);

您的嵌套查询正在选择匿名类型-您应该选择图书ID:

from book in Books
  where !(from student in students_books
          group student by student.bookId into GroupedPerStudent
          where GroupedPerStudent.Count() >= 500 
          select GroupedPerStudent.Key).Contains(book.bookid)
select book;
但我会用一种更积极的方式来表达——实际上,我会用两种不同的说法来让它更清晰:

var rarelyRead = from student in student_books
                 group student by student.bookId into grouped
                 where grouped.Count() < 5000
                 select grouped.Key;

var query = Books.Where(book => rarelyRead.Contains(book.book_id));
var rarelyRead=来自学生书籍中的学生
按student.bookId将学生分组为分组
其中分组。Count()<5000
选择分组键;
var query=Books.Where(book=>rarelyRead.Contains(book.book_id));
编辑:或者,根据Snowbear的建议,使用连接,我们将使用连接和查询继续以获得乐趣:

var query = from student in student_books
            group student by student.bookId into grouped
            where grouped.Count() < 5000
            select grouped.Key into rarelyRead
            join book in Books on rarelyRead equals book.book_id
            select book;
var query=来自学生书籍中的学生
按student.bookId将学生分组为分组
其中分组。Count()<5000
选择分组。键入rarelyRead
将book加入稀有书籍read等于book.book\u id
选择书籍;

您的嵌套查询正在选择匿名类型-您应该选择图书ID:

from book in Books
  where !(from student in students_books
          group student by student.bookId into GroupedPerStudent
          where GroupedPerStudent.Count() >= 500 
          select GroupedPerStudent.Key).Contains(book.bookid)
select book;
但我会用一种更积极的方式来表达——实际上,我会用两种不同的说法来让它更清晰:

var rarelyRead = from student in student_books
                 group student by student.bookId into grouped
                 where grouped.Count() < 5000
                 select grouped.Key;

var query = Books.Where(book => rarelyRead.Contains(book.book_id));
var rarelyRead=来自学生书籍中的学生
按student.bookId将学生分组为分组
其中分组。Count()<5000
选择分组键;
var query=Books.Where(book=>rarelyRead.Contains(book.book_id));
编辑:或者,根据Snowbear的建议,使用连接,我们将使用连接和查询继续以获得乐趣:

var query = from student in student_books
            group student by student.bookId into grouped
            where grouped.Count() < 5000
            select grouped.Key into rarelyRead
            join book in Books on rarelyRead equals book.book_id
            select book;
var query=来自学生书籍中的学生
按student.bookId将学生分组为分组
其中分组。Count()<5000
选择分组。键入rarelyRead
将book加入稀有书籍read等于book.book\u id
选择书籍;

Eh,不知道您可以继续这样查询。尽管我个人并不喜欢这种语法。@jonskeet,玩了一会儿编译器,它看起来像是你的
组。。by grouped
在“grouped”之前缺少另一个表达式和一个
中,但在其他方面,您是正确的。@devgeezer:现在再看一看-我想它就在那里。呃,不知道您可以继续这样查询。尽管我个人并不喜欢这种语法。@jonskeet,玩了一会儿编译器,它看起来像是你的
组。。by grouped
在“grouped”之前缺少另一个表达式和一个
中,但在其他方面,您是正确的。@devgeezer:现在再看一看-我想它在那里。谢谢您的建议。您能告诉我这两个查询之间的区别吗?@user,区别在于您的查询中有嵌套子查询,与我的查询相比,它更难阅读,因为我的查询可以逐行阅读。我的第二个查询实际上与Jon答案中的最后一个查询相同,但使用
Enumerable
方法编写,而他使用Linq语法编写查询。我想说,如果您喜欢Linq语法,您应该使用第二个或第三个Jon查询,否则使用我的第二个查询。谢谢您的建议。您能告诉我这两个查询之间的区别吗?@user,区别在于您的查询中有嵌套子查询,与我的查询相比,它更难阅读,因为我的查询可以逐行阅读。我的第二个查询实际上与Jon答案中的最后一个查询相同,但使用
Enumerable
方法编写,而他使用Linq语法编写查询。我想说,如果您喜欢Linq语法,您应该使用第二个或第三个Jon查询,否则使用我的第二个查询。