【发布时间】:2020-02-10 02:57:31
【问题描述】:
我正在重构我的 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>>?
谢谢!
【问题讨论】:
标签: c# linq linq-to-entities