как удалить, используя nhibernate, используя где с объединениями - PullRequest
0 голосов
/ 15 июля 2011

У меня есть следующий метод.Который возвращает «Не удалось выполнить запрос на обновление».Если я запрашиваю другое свойство сущностей, например "Order.Campaign.Id", мне нужно включить соединение?Как бы это сработало.?

public void RemoveOrderItems(int companyId, int campaignId, int productId, int orderStatus)
{
    using (ITransaction transaction = _session.BeginTransaction())
    {
        _session.CreateQuery("delete from OrderItem where Product.Id = '" + productId + "' and Order.Company.Id = '" + companyId + "' and Order.Campaign.Id = '" + campaignId + "' and Order.OrderStatus = '" + orderStatus + "'").ExecuteUpdate();
        transaction.Commit();
    }
}

** EDIT **

Вот SQL-оператор.

DELETE oi
FROM OrderItems oi inner JOIN  Orders o On oi.OrderId = o.Id
Where oi.ProductId = '13077' and o.CompanyId = '32' and o.CampaignId = '2' and o.OrderStatus = 3

Ответы [ 3 ]

3 голосов
/ 18 июля 2011
_session.CreateQuery(@"
    delete OrderItem oi
    where oi in
         (select i
          from OrderItem i
          where i.Product.Id = :productId
          and i.Order.Company.Id = :companyId
          and i.Order.Campaign.Id :campaignId
          and i.Order.OrderStatus = :orderStatus)
    ")
    .SetParameter("productId", productId)
    .SetParameter("companyId", companyId)
    .SetParameter("campaignId", campaignId)
    .SetParameter("orderStatus", orderStatus)
    .ExecuteUpdate();

Сгенерированный SQL не точно тот же, что вы создали вручную, но он семантически эквивалентен.

1 голос
/ 15 июля 2011

Найдите правильный запрос в SQL Server Management studio и после этого сделайте что-то похожее на мой пример (запрос может быть сложнее, конечно, с объединением, подзапросом)

ISession session = SessionFactory.GetCurrentSession();
using (var tx = session.BeginTransaction())
{
    try
    {
        IQuery myQuery = session.CreateQuery("DELETE FROM TableA c WHERE c.Field1 = :Filed1Value and c.Field2 = :Field2 ")
            .SetParameter("Field1", 25)
            .SetParameter("Field2", "Test")
        myQuery.ExecuteUpdate();
        tx.Commit();
    }
    catch (Exception)
    {
        tx.Rollback();
    }
}
1 голос
/ 15 июля 2011

Неверный оператор sql, ваш оператор where неверен. Попробуйте написать запрос в Microsoft SQL Server Management Studio, а затем переписать его с параметрами в CreateQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...