2015-09-19 151 views
1

人,Linq中的复杂分组? C#.NET

我有一对夫妇互相连接的实体:

public class MainObject { 
    public Guid property1; //one-to-many relationship 
    public Guid? property2; 
    public int? property3; 
    public List<PivorObject> PivotObjects; //one-to-many relationship 
} 

public PivotObject { 
    public Guid property4; //one-to-many relationship 
    public long property5; 
    public long property6; 
} 

我要组一个List<MainObject>以下标准:

  1. property1

  2. 相同property2 AND

  3. property3

  4. PivotObjects.FirstOrDefault(po => po.property5 == criterion1 && po.property6 == criterion2).Select(po => po.property4) OR PivotObjects.FirstOrDefault(po => po.property5 == criterion1 && po.property6 == criterion2) == null

在我想,因为它需要通过这种组合最初名单分开,有MainObject的重重叠叠的结果。因此,在可为空的类型为空的情况下,它们的评估与其他空值相同。

有没有一种优雅的方式来产生这样的分组?

我在询问有关groupby property1,property2内部结果组等内容的解决方案。我正在寻找可以吐出我需要的桩的东西。所以可能是一个带有4个键的字典或类似的东西。

+2

这是用于LINQ to Objects,或“out of process”LINQ吗?通过多个属性进行分组非常简单 - 只需使用具有匿名类型的GroupBy(例如'new {mo.property1,mo.property2,mo.property3}',但复杂的第四条标准可能会导致类似LINQ to SQL的问题。 –

+0

你好,乔恩,有懒惰的加载,所以它会从数据库中获取信息,但我不会推回任何东西。我想要的第四个键是来自适当的'PivotObject',或者当没有适当的匹配时为空。我不能通过'PivotObject'本身进行分组,因为'PivotObject'和'MainObject'之间存在多对一的关系。我想一种方法是按三条标准进行分组,然后在“foreach”中适当地分组。 – Nomenator

+0

当你试图做这个分组时,是否已经加载了所有内容?(它不会帮助你的分组看起来使用'criterion1'和'criterion2',它还没有被定义......) –

回答

0

我错过了什么吗?是不是只是:

var MainObject.GroupBy(m=>new { 
    m.Property1, 
    m.Property2, 
    m.Property3, 
    m.PivotObjects.FirstOrDefault(po => po.property5 == criterion1 && po.property6 == criterion2)?.property4) 
}); 
+0

当'm.PivotObjects.FirstOrDefault(po => po.property5 == criterion1 && po.property6 == criterion2)== null'时,寻址'property4'将抛出空异常。 – Nomenator

+0

使用'?.property4' –