- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 LINQ 有一些经验,但事实证明编写此查询有点超出我的理解范围。
请原谅我的伪代码...
class Person{
Collection<Communications> {get;set}
}
class Communication{
Collection<PersonSender> {get;set;}
Collection<BuildingSender> {get;set;}
}
class PersonSender{
Collection<Posts> {get;set}
}
class BuildingSender{
Collection<Posts> {get;set}
}
我想要完成的事情:将 Communication
分组关于它是否包含 PersonSender
实例的集合或 BuildingSender
当这些实例有 Post
实例本身。
然后我想对每组 Collection
执行选择查询对象,这样我就可以返回 IEnumerable
另一个对象的集合 Package
使用每个 Collection
在 select 语句中创建的的属性。 这里的关键是我需要对返回的每个组执行单独的选择语句
这是我到目前为止实际查询得到的结果
m.Communications.GroupBy(x =>
new {fromMember = (x.PersonSender.Any() && x.Posts.Any()),
fromBuilding = (x.BuildingSender.Any() && x.Posts.Any())})
.Select(u => new Package(u.PersonSender.First().Member,u.Posts.First()));
但是我很确定这不会编译,也不会为我提供我需要的多个选择语句。
GroupBy 是解决此问题的正确方法吗?有可能吗?
更新:根据@Hogan 的说法,我已经能够拼凑出一个工作解决方案。让我试着弄清楚我想做什么,我原来的问题不是很清楚......
此代码是类 PackageFactory
的一部分.此类中的每个方法都可以由我的应用程序中的 Controller 调用,要求一组 Package
对象。 Package
接受多种类型的 IEntity
对象作为参数并包装与关系关联的内容 IEntity
对象进入一个界面,任何其他在我的应用程序上显示信息的 Controller 都可以读取该界面。 TLDR Package
是一个美化的适配器模式设计对象。
PackageFactory
中的每个方法有查询 Communication
的工作存储库,查找相关的 Communication
具有正确属性集的对象,然后将对象子集(即 Communication
对象的属性)传递给新的 Package
在返回整组 Package
之前要包装的实例对象到 Controller ,以便它们可以呈现在页面上。
对于我为这个问题编写的方法,用户 m
收藏了 Communication
每个Communication
的对象来自 IEntity
针对用户 PersonSender
的对象(BuildingSender
或 m
) .我的查询是尝试隔离 Communication
对象分为两组,其中一组包含所有 Communication
其中 PeronSender
存在并且其中一个 BuildingSender
存在。这样我的方法就知道哪个组被传递给他们各自的 Package
类型。
我尝试使用 GroupBy 的逻辑是我宁愿使查询尽可能通用,这样我以后可以扩展到更多集合和/或通过不必调用许多单独的查询来提高方法的性能,然后加入他们。然而,似乎不可能在每个组上指定不同的选择查询。
@Hogan 的回答接近我想做的事情。
霍根的回答
var result =
m.comm.SelectMany(x => x.person).Where(x => x.posts.Any()).Select(new () { x.name, x.posts})
.Union(m.comm.SelectMany(x=> x.building).Where(x => x.posts.Any()).Select(new () {x.name, x.posts}));
修改后的答案
这是有效的:
return m.Communications.Where(x => x.SendingPerson.Any() && x.Posts.Any()).Select(u =>
new PostPackage(u.SendingPerson.First().Member,m,u.Posts.First()))
.Union(m.Communications.Where(x=> x.BuildingSender.Any() && x.Posts.Any()).Select(u =>
new PostPackage(u.BuildingSender.First().Building,m,u.Posts.First())));
不完全一样 -- 昨天写这题的时候脑袋有点蒙。
最佳答案
我认为关键是 SelectMany 而不是 GroupBy——这将“压平”子列表。如下所示:
与
class Person{
Collection<Communications> comm {get; set;}
}
class Communication{
Collection<PersonSender> person {get; set;}
Collection<BuildingSender> building {get; set;}
}
class PersonSender{
string name {get; set; }
Collection<Posts> posts {get; set;}
}
class BuildingSender{
string name {get; set; }
Collection<Posts> posts {get; set;}
}
假设 m 是一个人:
var result =
m.comm.SelectMany(x => x.person).Where(x => x.posts.Any()).Select(new () { x.name, x.posts})
.Union(m.comm.SelectMany(x=> x.building).Where(x => x.posts.Any()).Select(new () {x.name, x.posts}));
关于c# - LINQ Group By 如果一个对象有 x 个属性,则在每个组上选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004387/
我是一名优秀的程序员,十分优秀!