2013-10-14 3 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 (Linq to NHibernate)?

ответ

3

Я предполагаю, что вы будете иметь доступ к SomeCategory списка, а затем попробуйте

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

Я думаю, что это будет также работать тест уаг = (от с в session.Query () от c1 в t.Classes где c1.Id == идентификатор выберите в) .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, который выглядит так? почему безжалостные лямбды? –

+0

API QueryOver - это строго типизированная версия API ICriteria. Безглазные лямбды действуют как псевдоним в SQL. Кроме того, он помогает вам создавать запросы без необходимости принудительного обращения к классу QueryOver . Я действительно предпочитаю QueryOver по запросам LINQ. Это гораздо читаемо даже при построении динамических запросов. :) – cidico

Смежные вопросы