NHibernate - Запрос по примеру - Подзапрос - PullRequest
0 голосов
/ 07 октября 2009

Я знаю, что в NHibernate есть МНОГИЕ способы достижения следующих целей - меня не интересуют другие сценарии. Меня интересует, возможно ли автоматически генерировать подзапрос, используя отношение «многие к одному» и запрос в качестве примера в NHibernate.

Моя настройка следующая:

public class Customer
{
    public virtual int ID { get; set; }
    public virtual string Firstname { get; set; }
    public virtual string Lastname { get; set; }
    public virtual IList<Orders> CustomerOrders { get; set;}
}

Мое отображение выглядит примерно так:

<property name="FirstName" type="string" length="200" not-null="true"/>
<property name="Lastname " type="string" length="20" not-null="true"/>


<bag name="CustomerOrders" cascade="save-update" inverse="true">
  <key column="CustomerID" on-delete="cascade" />
  <one-to-many class="myassembly.CustomerOrders, myassembly" />
</bag>

Простое QBE присваивает FirstName и / или LastName значение и возвращает IList, содержащий клиентов, которые имеют это имя и / или фамилию.

Что я хотел бы сделать, это добавить заказы в список CustomerOrders, что приведет к следующему запросу:

select * from CustomerOrders c where FirstName = 'myfirstname' and LastName = 'mylastName' inner join Orders o on c.CustomerID = o.OrderID
where o.OrderName = 'myorderName' and o.OrderNumber = 'myordernumber' 

В приведенном выше примере OrderName и OrderNumber являются свойствами класса Order (в целях краткости я не включил этот класс). Кто-нибудь знает возможно ли это? Пожалуйста, дайте мне знать, если мне нужно уточнить мой вопрос. По сути, я могу заполнить примитивные значения и включить их в QBE. Могу ли я сделать то же самое с коллекциями?

1 Ответ

0 голосов
/ 07 октября 2009

Я не уверен, что понимаю ....

Когда вы делаете это:

using (ITransaction tx = session.BeginTransaction())
{
     IList<Customer> customers =  
                 session.CreateCriteria(typeof(Customer))
                .Add(Expression.Eq("FirstName", "MyFirstName"))
                .Add(Expression.Eq("LastName", "MyLastName"))
                .List<Customer>();

     customers[0].CustomerOrders.Add(new Orders());

     tx.Commit();
}

Здесь это не QBE, а API критериев, но вы можете изменить его.

...