gpt4 book ai didi

c# - LINQ Group By 如果一个对象有 x 个属性,则在每个组上选择

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:05 25 4
gpt4 key购买 nike

我对 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 的对象(BuildingSenderm) .我的查询是尝试隔离 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com