我的班级 struct 是这样的:

Person
Dogs (dog 1, dog 2, etc)
Puppies (puppy A, puppy B, etc)

只有一个人.他有1..n条狗.每只狗有一只..小狗.

我想要一份所有可能的小狗组合的 list ,从每只狗身上取一只小狗.如:

狗1小狗A,狗2小狗A

如果是在sql表中,我会执行如下操作来"乘法"表:

select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'

有什么灵巧的方法来做这种事吗???

非常感谢

推荐答案

如果我理解这个问题,你想要Cartesian Product只n组小狗.

如果在编译时知道有多少集合,就很容易得到笛卡尔积:

from p1 in dog1.Puppies
from p2 in dog2.Puppies
from p3 in dog3.Puppies
select new {p1, p2, p3};

假设dog1有小狗p11,p12,dog2有小狗p21,dog3有小狗p31,p32.这给你

{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}

其中每一行都是匿名类型.如果在编译时不知道有多少个集合,可以稍微多做一些工作.见我关于这个主题的文章:

http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

还有这个问题:

Generating all Possible Combinations

一旦你有了方法CartesianProduct<T>,你就可以说

CartesianProduct(from dog in person.Dogs select dog.Puppies)

得到

{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}

每一排都是一系列的小狗.

有道理?

Sql相关问答推荐

识别顺序记录组

前面的语句不喜欢AND LIKE?当try 更新使用ID和日期过滤的表时

如何使用WSO2将空值传递给我的SQL Server存储过程?

如何利用单列历史SQLsnowflake获得合并结果

按分隔符和总和分析字符串

如何计算给定日期前三个月的值以及月初数据?

重用传递给 node 的参数-postgres upsert查询

HAVING子句内部过滤的正确方法

如何在连接中使用三个不同的列,从而在PostgreSQL中只获得两个列?

AdventureWorks 查询

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

如何将输出转换为二维格式?

使用 GROUP BY 时如何创建其他组?

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

超过100名员工的连续行

如何通过子 Select 在一次更新(并行数组)中多次更新相同的行

每组跨行曲折?

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数