powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / [nHib]
11 сообщений из 11, страница 1 из 1
[nHib]
    #36428245
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
Коллеги, добрый день
Советуюсь как эффективно реализовать запрос, который будет переодически грузить сервер приложений.
Происходит синхронизация. Если для Not_sync_price нашлась запись в Sync_record ее надо перетащить в синхранизованный Price. На sqlе это решалось просто:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO Price
SELECT 
       sr.product_id,nsp.client_id,nsp.quantity,nsp.price_retail
FROM 
       Not_sync_price nsp
INNER JOIN
        Sync_record sr ON sr.client_id=nsp.client_id AND 
                                    nsp.client_product_id=sr.client_product_id

В хибернейте же мне непонятно, как это сделать на уровне объектов.
...
Рейтинг: 0 / 0
[nHib]
    #36428421
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тут у Вас в два этапа должны происходить манипуляуции:

Выборка

Код: plaintext
1.
2.
3.
4.
SELECT 
       sr.product_id,nsp.client_id,nsp.quantity,nsp.price_retail
FROM 
       Not_sync_price nsp
INNER JOIN Sync_record sr ON sr.client_id=nsp.client_id AND nsp.client_product_id=sr.client_product_id


Вставка

Код: plaintext
INSERT INTO Price

Как я понимаю, маппинг на Price у Вас уже готов.

Как вариант, средствами динамики получаем прайсы (имеем поля sr.product_id,nsp.client_id,nsp.quantity,nsp.price_retail) и кастим в тип Price.

Пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
IList<Product> products = session.CreateSQLQuery(
    @"SELECT p.ProductId, p.ProductName, p.CategoryId
    FROM   Products p
    INNER JOIN Categories c ON  p.CategoryId = c.CategoryId AND p.ProductName = c.CategoryName"
    )
    .AddEntity(typeof(Product))
    .List<Product>();

Теперь имея типизированный список (в моём случае это products) мы можем смело осуществлять его импорт через Ваш дал (насколько я помню, у Вас паттерн репозиторий).

...P.S. На будущее: приводите классы и маппинги
...
Рейтинг: 0 / 0
[nHib]
    #36428751
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
Отлично!
CreateSQLQuery творит чудеса, особенно с приведением типов.
Я пытался оставаться в рамках HQL, но мне не удавалось его заставить джойнить.
Я подумал, что это из-за не совсем стандартных сущностей.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class Product : BaseDomain,IDbAuditable
{
        public virtual string Name { get; set; }        
        public Product() { }
        public new class Properties
        { }
}

public class NotSyncPrice : BaseDomain
{
        public virtual Client Client { get; set; }
        public virtual int? ClientIdProduct{ get; set;}
        .....
        public NotSyncPrice() { }
}

public class SyncRecord : BaseDomain
{
        public virtual Product Product { get; set; }
        public virtual int ClientIdProduct { get; set; }
        public virtual Client Client { get; set; }
        public SyncRecord() { }
        public new class Properties
        {... };
}

PS
МСУ, Вам еще раз спасибо.
Пока Ваш совет ускоряет мой код на всех фронтах
...
Рейтинг: 0 / 0
[nHib]
    #36428849
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HugCreateSQLQuery творит чудеса, особенно с приведением типов.
Да, это верно :)
Памятка: если нужно еще добавить условие WHERE, не нужно пихать значение в стрингу запроса, используйте параметризацию.

sample
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
IList<Product> products = session.CreateSQLQuery(
    @"SELECT p.ProductId, p.ProductName, p.CategoryId
    FROM   Products p
    INNER JOIN Categories c ON  p.CategoryId = c.CategoryId AND p.ProductName = c.CategoryName
    WHERE p.ProductId= :ProductId"
    )
    .AddEntity(typeof(Product))
    .SetInt32("ProductId", id)
    .List<Product>();


P.S. CreateSQLQuery используйте в самом крайнем случае, когда нет возможности решить задачу средствами объектной модели хиба, которая идет вразрез с маппингами.
...
Рейтинг: 0 / 0
[nHib]
    #36428884
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
А забыл спросить самое главное.
О скорости..
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
INSERT INTO Price
SELECT 
       sr.product_id,nsp.client_id,nsp.quantity,nsp.price_retail
FROM 
       Not_sync_price nsp
INNER JOIN
        Sync_record sr ON sr.client_id=nsp.client_id AND 
                                    nsp.client_product_id=sr.client_product_id

Эта штука спокойно выполняется, загружая только БД звено

Наши же с Вами 2 этапа мало того, что все равно загрузят БД звено, так еще и дадут погреться
серверу приложений. А эта вещь, которая в демоне будет крутиться круглосуточно по нескольку раз в день.
Стоит ли здесь быть принципиальным и следовать идеалогии?

SP: Прямо так и подмывает вызвать sp, чем писать 2 этапа.
...
Рейтинг: 0 / 0
[nHib]
    #36428892
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
МСУHugCreateSQLQuery творит чудеса, особенно с приведением типов.
Да, это верно :)
Памятка: если нужно еще добавить условие WHERE, не нужно пихать значение в стрингу запроса, используйте параметризацию.

P.S. CreateSQLQuery используйте в самом крайнем случае, когда нет возможности решить задачу средствами объектной модели хиба, которая идет вразрез с маппингами.

1) Конечно. Запрос кешится, а параметры потом подставляются.
2) Так я и мучал hql. Понял, что не выкатывает)
...
Рейтинг: 0 / 0
[nHib]
    #36429014
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HugSP: Прямо так и подмывает вызвать sp, чем писать 2 этапа.

Вопрос идеологический, да. Ну я бы Вам рекомендовал поразмыслить о быстродействии данной операции плюс помноженное на максимальное кол-во пользователей в единицу времени, которые исполняют данную манипуляцию.

Если вопрос скорострельности стоит ребром - то конечно же хп. Если же данные манипуляции будет осуществлять одна бабушка на складе раз в час на табличках из тыщи записей, то думаю можно посмотреть в сторону "красивостей".

P.S. Всё от задачи зависит.
...
Рейтинг: 0 / 0
[nHib]
    #36429225
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
Задача - постоянной работающий демон - мониторщик
Перегружающий данные из 1 таблицы в другую..

ЗЫ Подмешал в репозиторий ado.net. Вкусно)
...
Рейтинг: 0 / 0
[nHib]
    #36429252
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HugЗЫ Подмешал в репозиторий ado.net. Вкусно)
Нафига? :) Хиб отлично работает с хранимками.
...
Рейтинг: 0 / 0
[nHib]
    #36429478
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
МСУHugЗЫ Подмешал в репозиторий ado.net. Вкусно)
Нафига? :) Хиб отлично работает с хранимками.

Вот засранцы. Все предусмотрели.

Код: plaintext
1.
2.
3.
<sql-query name="MoveSyncEntityToPrice">
    call move_sync_to_price
</sql-query>

Чеж они допускают прямой sql то. А если я уеду с mysql? Кто будет менять call на exec?
...
Рейтинг: 0 / 0
[nHib]
    #36429545
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HugМСУHugЗЫ Подмешал в репозиторий ado.net. Вкусно)
Нафига? :) Хиб отлично работает с хранимками.

Вот засранцы. Все предусмотрели.

Код: plaintext
1.
2.
3.
<sql-query name="MoveSyncEntityToPrice">
    call move_sync_to_price
</sql-query>

Чеж они допускают прямой sql то. А если я уеду с mysql? Кто будет менять call на exec?

Я не уверен на счет мускула, но попробуйте такой маппинг (GetBooks - это хп):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="..." assembly="...">
	<sql-query name="BookQuery" callable="true">
		<query-param name="LikeTitle" type="string" />
		<return class="Book">
			<return-property column="ID" name="ID" />
			<return-property column="ISBN" name="ISBN" />
			<return-property column="Title" name="Title" />
		</return>
		GetBooks @LikeTitle =:LikeTitle
	</sql-query>
</hibernate-mapping>

Собственно, сам вызов:

Код: plaintext
1.
2.
var query = session.GetNamedQuery("BookQuery")
    .SetParameter<string>("LikeTitle", "%кн%")
    .List<Book>();

P.S. А так, разумеется с хп нужно быть аккуратным. Не на всех sql-серверах маппинг сработает. Нужно тестить.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / [nHib]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]