2013-10-14 55 views
0

一个看似简单的问题原来更加困难比我想:选择父给出子ID

public class SomeCategory 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<SomeClass> SomeInstances { get; set; } 
} 

public class SomeClass 
{ 
    public virtual int Id { get; set; } 
} 

有一个1:SomeClass的和SomeCategory米之间关系(即SomeClass的实例属于一个SomeCategory和SomeCategory可以有几个SomeClass实例)。

问题如何获得SomeCategory给定SomeClass Id(Linq to NHibernate)?

回答

3

我假设你将有机会获得SomeCategory列表,然后

var category = someCategoryList.FirstOrDefault(e => e.SomeInstances 
           .Any(a => a.Id == someclassId)); 
+0

我认为这也将工作 VAR测试=(从session.Query () 从C1下,在t.Classes 其中c1.Id == ID 选择C).FirstOrDefault(); – Fran

1

你也可以做到这一点使用QueryOver尝试。

Parent parentAlias = null; 
Child childAlias = null; 

var query = session.QueryOver<Parent>(() => parentAlias) 
        .JoinAlias(()=> parent.Childs,()=> childAlias) 
        .Where(()=> childAlias.Parent.Id == id) 
        .Select(()=> childAlias.Parent) 
        .SingleOrDefault(); 
+0

完全偏离主题,有人可以解释为什么NH有一个看起来像这样的API?为什么无精打采的lambda? –

+0

QueryOver API是ICriteria API的强类型版本。无精打采的lambda表现就像SQL中的别名一样。此外,它可以帮助您构建查询,而无需强制参考QueryOver 类。我真的比LINQ查询更喜欢QueryOver。即使构建动态查询,它也更具可读性。 :) – cidico