Linq Query返回IQueryable <ienumerable <user>&gt;不是IQueryable <user> </user> </ienumerable <user>

时间:2012-05-03 17:08:33

标签: c# linq linq-to-entities

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

http://blog.iannelson.systems/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();

即。在AsQueryable()上拨打IEnumerable<User>会返回IQueryable<User>而不是(如上例所示)IQueryable<IEnumerable<User>>

任何人都可以对此有所了解吗?

两种类型之间的真正区别是什么?如何强制我上面的示例给我IQueryable<User>而不是IQueryable<IEnumerable<User>>

谢谢!

1 个答案:

答案 0 :(得分:7)

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

目前您的查询是这样的:

“对于每个用户,请向我提供所有以”

“开头的朋友的列表

所以你有一份清单,可以这么说。 SelectMany是一种说法,“将这个列表中的每个东西变成一系列事物,然后将这些序列连接在一起。结果是一大堆事物,而不是一系列事物列表。

(当我在这个回复中说“list”时,我的意思是序列,即IEnumerable / IQueryable。)