Linq 查询返回 IQueryable> not IQueryable

本文关键字:User IQueryable 查询 not IEnumerable Linq 返回 | 更新日期: 2023-09-27 18:33:10

我正在重构我的 EF 存储库类以使它们可测试,遵循这篇优秀博客文章中的建议:

https://blog.iannelson.uk/testing-linq-queries/

一切都很好,我还能够像博客文章中那样链接IQueryable扩展方法,使事情更加良心和更易于阅读。

我遇到了与相关List<>有关的障碍。

域实体是一个用户,用户具有类型 List<User> - 标准社交网络范例的好友集合。

我想搜索用户朋友的子集,说用户名以"a"开头的所有朋友。 所以我这样做:

    public static IQueryable<IEnumerable<User>> SelectFriendsUsernameStartsWith(this IQueryable<User> userQueryable, string searchQuery)
     {
        return userQueryable.Select(x => x.Friends.Where(y => y.Username.StartsWith(searchQuery)));
     }

问题是这打破了我的链条。 返回类型不再IQueryable<User>IQueryable<IEnumerable<User>>,因此我为 IQueryable<User>编写的扩展方法无法链接到末尾。

这里的类型差异对我来说没有任何意义,因为在我的单元测试中,我的代码如下所示:

            IEnumerable<User> users = new HashSet<User>()
                                    {
                                        new User() {Username = "Aaron"},
                                        new User() {Username = "alex"},
                                        new User() {Username = "Ally"},
                                        new User() {Username = "anthony"},
                                        new User() {Username = "bob"},
                                        new User() {Username = "Bill"}
                                    };
        IQueryable<User> userQueryable = users.AsQueryable();

即在IEnumerable<User>上调用AsQueryable()返回IQueryable<User>而不是(如上例所示(IQueryable<IEnumerable<User>>

谁能对此有所了解?

这两种类型之间的真正区别是什么,我如何强制我上面的示例返回一个IQueryable<User>而不是IQueryable<IEnumerable<User>>

谢谢!

Linq 查询返回 IQueryable<IEnumerable<User>> not IQueryable<User>

userQueryable.Select(...更改为userQueryable.SelectMany(...

目前,您的查询执行以下操作:

"对于每个用户,给我一个以某事开头的所有朋友的列表">

所以你有一个列表列表,可以这么说。 SelectMany是一种说法,"把这个列表中的每件事变成一个事物序列,然后将这些序列连接在一起。 结果是一个很长的事物列表,而不是事物列表的列表。

(当我在这个回复中说"列表"时,我的意思是序列,即IEnumerable/IQueryable。