2010-02-15 2 views
2

Вот три класса в моем домене:Выбор ребенка проекция из родительского

public class Quote : IEntity, IAggregateRoot { 
    public int QuoteId { get; set; } 
    public IEnumerable<Price> Prices { get; set; } 
} 

public class Price : IEntity { 
    public int PriceId { get; set; } 
    public Carrier Carrier { get; set; } 
    public decimal? Price { get; set; } 
    public Quote Quote { get; set; } 
} 

public class Carrier : IEntity, IAggregateRoot { 
    public int CarrierId { get; set; } 
    public string Name { get; set; } 
} 

Я хочу, чтобы иметь возможность выбрать проекцию на основе цен в котировке. Тип возврата должен быть IEnumerable < [анонимный объект]>. Я должен запустить запрос из Quote, потому что это объект корневого домена. Вот то, что я до сих пор:

session.Linq<Quote>() 
    .Expand("Prices") 
    .Where(q => q.QuoteId == 1) 
    .Select(q => { 
     //this is where I don't know what to do. 
     //Maybe somthing like this: 
     return q.Prices.Select(p => { 
      new { CustomerName = p.Customer.Name, Price = p.Price } 
     }); 
    }); 

Отображения бы:

  • Quote.Prices> HasMany (один-ко-многим)
  • Price.Quote> Список литературы (многие к -она)
  • Price.Carrier> Список литературы (один-к-одному)

ответ

2

Я нашел мой ответ. Я полностью забыл о выражении SelectMany Linq. Вот мое решение.

session.Linq<Quote>() 
    .Where(q => q.QuoteId == 1) 
    .SelectMany(q => q.Prices, (q, p) => new { CustomerName = p.Customer.Name }); 
+1

Как это было бы с QueryOver? –

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