鉴于以下两个不同的集合:
IQueryable<Book> allBooks = context.Books.Where(b => b.UserID == hostID);
var visBookTitles = context.Books.Where(b => b.UserID == visitorID)
.Select(b =>b.Title.ToLower()).ToList();
最有效的方式(最好使用方法语法)返回allBooks
中与visBookTitles
中的任何标题共享公共标题的所有图书?
答案 0 :(得分:2)
如果集合中的项目应该被视为相等,则使用Intersect()
;如果它们仅共享某些属性,则使用Join()
。在您的情况下,您正在交叉书籍和标题,因此Join()
是最合适的。
var query = allBooks.Join(visBookTitles,
book => book.Title,
title => title,
(book, title) => book);
答案 1 :(得分:1)
像这样:
var bookTitles = new HashSet<string>(visBookTitles, StringComparer.OrdinalIgnoreCase);
var someBooks = allBooks.AsEnumerable().Where(b => bookTitles.Contains(b.Title));
您还应该摆脱ToLower
电话。 (StringComparer.OrdinalIgnoreCase
速度更快,处理凌乱的Unicode情况)