【问题标题】:Linq Query returning IQueryable<IEnumerable<User>> not IQueryable<User>Linq 查询返回 IQueryable<IEnumerable<User>> 不是 IQueryable<User>
【发布时间】:2020-02-10 02:57:31
【问题描述】:

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

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

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

我遇到了与关联的List&lt;&gt; 相关的障碍。

域实体是一个用户,一个用户有一个类型为List&lt;User&gt;的朋友集合——标准社交网络范式。

我想搜索用户朋友的子集,比如所有用户名以“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&lt;User&gt; 而是IQueryable&lt;IEnumerable&lt;User&gt;&gt;,所以我为IQueryable&lt;User&gt; 编写的扩展方法不能链接到最后。

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

            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&lt;User&gt; 上调用 AsQueryable() 会返回 IQueryable&lt;User&gt; 而不是(如上例)IQueryable&lt;IEnumerable&lt;User&gt;&gt;

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

这两种类型之间的真正区别是什么?如何强制上面的示例返回IQueryable&lt;User&gt; 而不是IQueryable&lt;IEnumerable&lt;User&gt;&gt;?

谢谢!

【问题讨论】:

    标签: c# linq linq-to-entities


    【解决方案1】:

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

    目前你的查询是这样的:

    “对于每个用户,给我一份他们所有以某事开头的朋友的列表”

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      相关资源
      最近更新 更多