rea*_*ers 2 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)));
}
Run Code Online (Sandbox Code Playgroud)
问题是这打破了我的束缚.返回类型不再是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();
Run Code Online (Sandbox Code Playgroud)
即调用AsQueryable()上的IEnumerable<User>返回一个IQueryable<User>不(如在上面的例子中)的IQueryable<IEnumerable<User>>
任何人都可以对此有所了解吗?
这两种类型之间的真正区别是什么?如何强制我上面的例子给我一个IQueryable<User>不是IQueryable<IEnumerable<User>>?
谢谢!
更改userQueryable.Select(...到userQueryable.SelectMany(...
目前您的查询执行以下操作:
"对于每个用户,请列出他们所有以某事开头的朋友"
所以你有一份清单,可以这么说. SelectMany这是一种说法,"将这个列表中的每个东西变成一系列事物,然后将这些序列连接在一起.结果是一大堆事物,而不是一系列事物列表.
(当我在这个回复中说"list"时,我的意思是序列,即IEnumerable/IQueryable.)
| 归档时间: |
|
| 查看次数: |
611 次 |
| 最近记录: |