powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / oData - лукап проперти
32 сообщений из 32, показаны все 2 страниц
oData - лукап проперти
    #39351336
баз лайтер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казалось бы, задача из учебника, однако в моём её нет. Есть простая таблица
Код: sql
1.
2.
3.
4.
5.
Table Product (
  Id int
 ,Name varchar(255)
 ,CategoryId int FOREIGN KEY References Category(id)
)


Есть соответствующая сущность в EntityFramework 6 CodeFirst, причём Category это тоже class, не enum

В JSON хочется видеть property, а не вложенный объект
Код: javascript
1.
2.
3.
4.
5.
{
    "Id": 1,
    "Name": "Product1",
    "Category": "FirstCategory"
}

причём updatable

Куда гуглить?
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351420
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баз лайтер,

Делать проекцию. Гугли в сторону OData + AutoMapper, например

http://codethug.com/2015/02/13/web-api-deep-dive-dto-transformations-and-automapper-part-5-of-6/

В кратце, ты делаешь для своего продукт проекцию ProductDto, в которой твоя проперти превращается из вложенного объекта в примитивное свойство. Объяснять на пальцах долго, лучше погугли, посмотри примеры, навалом их. Если что непонятно, спрашивай.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351806
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не назвал это задачкой из учебника. Это обход модели. Вот тут я показывал, как можно трачиться по кастомному свойству http://codearticles.ru/articles/2736
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351844
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиЯ бы не назвал это задачкой из учебника. Это обход модели. Вот тут я показывал, как можно трачиться по кастомному свойству http://codearticles.ru/articles/2736

Какой глупый и вредный пример.

Есть нормальные проекции, максимально эффективные и простые, позволяют использовать всю мощь запросов через проекции, следовательно, кладутся на OData, как влитые.

Зачем вот такой фигнёй заниматься, как у тебя в примере?
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351878
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, смотри, в чём различие. Я привел валидный пример, который 100% работает. Ты привел какой-то мусор с маппингами, никакой конкретики по существу. О чем с тобой можно говорить?
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351910
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смузи,

а зачем показывать кишки внутреней сущности наружу? ты ж в любом случае отдаешь модель снизу + доп свойства. дто разве не чище будет и не будет тащить лишнего с нижних уровней, как хвост и пишет.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351920
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu, не понимаю вопроса. SiteExt чем не дто? Речь о том, как поставить это дто в модель. Типовое наследование или проекции. Я понимаю, о чем хвост пишет, имел дело с проекциями еще в RIA сервисах (зародыш одаты под сервелат). Нахлебался. Просто хочу от него не теоретические сопли, а реальную практику. Тогда дальше продолжим.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351929
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смузи,

SiteExt да можно считать как дто, но оно наследует все свойства объекта, а оно может быть и не нужно. я просто часто видел что прям сущности уровня бд выплевывают и думаю что это не совсем правильно. хотя конечно могу ошибаться. вот на java-стартапе мне заставляет код нотация делать через наследование сущестей уровня хибера эт делать. у себя в проектах на .net. я перекладываю через плоские дто. поэтому и спросил, может в этом диалоге я пойму что делал не так.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39351993
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuСмузи, SiteExt да можно считать как дто, но оно наследует все свойства объекта, а оно может быть и не нужно.
Именно это и нужно в исходной задаче :) "хочется видеть property, а не вложенный объект"

handmadeFromRuя просто часто видел что прям сущности уровня бд выплевывают и думаю что это не совсем правильно.
В схему никто не гадит. Это чистый дто под ключ + ef маппинги (builder.EntitySet). И вся эта радость на ODataController.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352000
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиhVostt, смотри, в чём различие. Я привел валидный пример, который 100% работает. Ты привел какой-то мусор с маппингами, никакой конкретики по существу. О чем с тобой можно говорить?

Ключевое различие в том, что ты не понимаешь в чём разница чистой выборки и SELECT N+1, в решении которое ты привёл. Маппить коллекции, имея возможность просто и удобно проецировать в DTO, имея готовый инструмент, это идиотизм. Уж извини. Идиотизм. Точка.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352006
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиИменно это и нужно в исходной задаче :) "хочется видеть property, а не вложенный объект"

В твоём решении твой маппинг слазиет за дополнительной пропертёй во вложенном объекте, сделав N запросов к серверу. Чтобы этого избежать, придётся присобачить Include, а если выборка из вложенного объекта более сложная, например, надо посчитать количество или сумму вложенных объектов одним запросом, и чтобы по этой проперти можно было прозрачно фильтровать, Include положит сервак на лопатки.

Ты «нахлебался» с проекциями, потому что так и не научился ими пользоваться. Кури ProjectTo(), это одним словом красота, генерятся офигенно быстрые SQL, ничего лишнего, поверх проекций легко фигачатся запросы, как к объектам контекста напрямую.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352033
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, пример для одаты будет?
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352042
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВ твоём решении твой маппинг слазиет за дополнительной пропертёй во вложенном объекте, сделав N запросов к серверу.
Тут не удержался, чтобы эту глупость не прокомментировать. Читай про $expand odata filter, одним запросом выбирается то, что нужно и намапливается на то, что нужно.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352077
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиТут не удержался, чтобы эту глупость не прокомментировать. Читай про $expand odata filter, одним запросом выбирается то, что нужно и намапливается на то, что нужно.

Экспанд тебе не поможет, если ты хочешь инкапсулировать подзапрос, например отсечь вложенные удалённые записи, или не проходящие по безопасности, отдавать кишки реальной модели данных в БД никто в здравом уме никогда не будет.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352085
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смузи,

Код: c#
1.
2.
3.
4.
[EnableQuery]
public IQueryable<ProductDto> Get() {
    return _store.Query().ProjectTo<ProductDto>();
}



Всё, что для клиента, лишнее отсекается в конфигурации проекции. Если требуется протащить безопасность, передаётся параметрами внутрь подзапроса. В результате имеем очень быстрый и эффективный запрос, без SELECT N+1.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352180
баз лайтер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за конструктивную дискуссию, пилю DTO для всех 100500 корневых сущностей, и настраиваю мэппинги в обе стороны
Код: c#
1.
2.
3.
4.
5.
Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Models.Product, ProductDTO>();
                cfg.CreateMap<ProductDTO, Models.Product>();
            });
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352198
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttотсечь вложенные удалённые записи
ODataQueryOptions

hVosttВсё, что для клиента, лишнее отсекается в конфигурации проекции
Третий раз прошу выкатить полностью валидный код, но снова какие-то огрызки кода.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352232
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баз лайтерспасибо за конструктивную дискуссию, пилю DTO для всех 100500 корневых сущностей, и настраиваю мэппинги в обе стороны
Код: c#
1.
2.
3.
4.
5.
Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Models.Product, ProductDTO>();
                cfg.CreateMap<ProductDTO, Models.Product>();
            });


замахаешься :)
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352286
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баз лайтери настраиваю мэппинги в обе стороны

Есть ReverseMap() для простых вариантов.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352376
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиhVosttотсечь вложенные удалённые записи
ODataQueryOptions

Т.е. ты хочешь пописать много кода, который просто можно было бы не писать и получить гораздо более эффективный результат? Ахахах.. Тем более QueryOptions также применим и для проекций, такскзать в old school стиле.


СмузиТретий раз прошу выкатить полностью валидный код, но снова какие-то огрызки кода.

Приведённого мною кода вполне достаточно для понимания. Если что-то не понятно, задай вопрос.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352378
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баз лайтерспасибо за конструктивную дискуссию, пилю DTO для всех 100500 корневых сущностей, и настраиваю мэппинги в обе стороны
Код: c#
1.
2.
3.
4.
5.
Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Models.Product, ProductDTO>();
                cfg.CreateMap<ProductDTO, Models.Product>();
            });



Очень не удобный и плохой подход. Используй:

1) профили и автоматическое сканирование в рамках модуля

https://github.com/AutoMapper/AutoMapper/wiki/Configuration

2) ReverseMap
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352404
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТ.е. ты хочешь пописать много кода, который просто можно было бы не писать и получить гораздо более эффективный результат? Ахахах.. Тем более QueryOptions также применим и для проекций, такскзать в old school стиле.
Не важно какой стиль, я говорю о рабочих решениях. Ниже варианты разбора. Один из них транслирует IQueryable для аксапты (нативный коннектор, который не поддерживает в коробке IQueryable).
http://codearticles.ru/articles/2486
http://codearticles.ru/articles/2472
http://codearticles.ru/articles/2522

hVosttПриведённого мною кода вполне достаточно для понимания.
Всё с тобой понятно. Когда дорастешь до рабочего кода, приходи - поговорим. А пока теоретики идут в лес.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352446
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиhVosttТ.е. ты хочешь пописать много кода, который просто можно было бы не писать и получить гораздо более эффективный результат? Ахахах.. Тем более QueryOptions также применим и для проекций, такскзать в old school стиле.
Не важно какой стиль, я говорю о рабочих решениях. Ниже варианты разбора. Один из них транслирует IQueryable для аксапты (нативный коннектор, который не поддерживает в коробке IQueryable).
http://codearticles.ru/articles/2486
http://codearticles.ru/articles/2472
http://codearticles.ru/articles/2522

hVosttПриведённого мною кода вполне достаточно для понимания.
Всё с тобой понятно. Когда дорастешь до рабочего кода, приходи - поговорим. А пока теоретики идут в лес.

Ну и чё ты накидал какого-то барахла тут? Я критиковал очень конкретный пример, который ты привёл по ссылке codearticles.ru/articles/2736, я сказал в чём конкретно проблема этого примера, почему он вредный. Могу повторить ещё раз: SELECT N+1, не целевое наследование (добавление в иерархию классов Entity, чтобы добавить поле — да ты точно упоролся!).

Не понимаю чё ты упираешься? С чем не согласен? Сам же упоминал про Automapper IQueryable Extensions, т.е. прекрасно знаешь о чём я говорю, но только откуда столько пренебрежения? Любишь строчить код? Ну это же твой фетишь, писать как можно больше кода. Пускай новички учатся решать свои задачи наименьшим количеством строк кода с максимальной эффективностью и гибкостью. Ты же можешь колотить по клавиатуре дальше
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352448
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt(добавление в иерархию классов Entity, чтобы добавить поле — да ты точно упоролся!)

* поле чисто для передачи данных клиенту (по сути функциональность DTO).
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352477
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ критиковал очень конкретный пример, который ты привёл по ссылке codearticles.ru/articles/2736
Задачи у автора такой не стояло. Критиковать можно даже Библию, только какое это имеет отношение к сабжу.

hVosttя сказал в чём конкретно проблема этого примера, почему он вредный.
Я ответил, проблема решается трансляцией IQueryable из ODataQueryOptions. Да, кода больше, но это 100% рабочее решение. Его плюс, что оно применяется в там, где никакими IQueryable и не пахнет. Я могу сам сконструировать любой запрос с фильтрами и сортировками (например, X++), который полезет в совсем другой движок и вытащит данные. Понимаешь, о чем речь?

hVosttНе понимаю чё ты упираешься?
Я не упираюсь. Я прошу привести годный пример, а не фантазировать о теориях. Ты привести такой пример не можешь. Собственно, не вижу смысла дальше продолжать с тобой эту тему.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352494
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиЗадачи у автора такой не стояло. Критиковать можно даже Библию, только какое это имеет отношение к сабжу.

Ты привёл очень плохое решение. Я пояснил почему. К сабжу оно имеет прямое отношение, ты даёшь вредные советы. То, что они при этом рабочие — не оправдание.

СмузиЯ ответил, проблема решается трансляцией IQueryable из ODataQueryOptions. Да, кода больше, но это 100% рабочее решение. Его плюс, что оно применяется в там, где никакими IQueryable и не пахнет. Я могу сам сконструировать любой запрос с фильтрами и сортировками (например, X++), который полезет в совсем другой движок и вытащит данные. Понимаешь, о чем речь?

Плюс, про который ты говоришь, очевиден только в единичных случаях. Я согласен, что такие бывают, они обязательно будут, но это не значит, что из-за них надо теперь всегда решать задачу сложно, когда в большинстве случаев её решить можно просто и гораздо меньшими усилиями. Большая часть покрывается проекциями в DTO, при чём довольно сложными и с параметризованными подзапросами, которые Automapper делать умеет.


СмузиЯ не упираюсь. Я прошу привести годный пример, а не фантазировать о теориях. Ты привести такой пример не можешь. Собственно, не вижу смысла дальше продолжать с тобой эту тему.

Код: c#
1.
2.
3.
4.
[EnableQuery]
public IQueryable<ProductDto> Get() {
    return _dbContext.Products.ProjectTo<ProductDto>();
}



Ещё больше упростил пример. Что тебе здесь непонятно?
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352517
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, всё что я сказал выше - повторил несколько раз. Твоя квалификация под вопросом, в дальнейшем обсуждении темы не вижу смысла.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352620
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиhVostt, всё что я сказал выше - повторил несколько раз. Твоя квалификация под вопросом, в дальнейшем обсуждении темы не вижу смысла.

Хорошая попытка, МСУ, но нет Спрашиваю, что тебе не понятно в приведённом примере, чего не хватает, ты несёшь какой-то больной бред насчёт квалификации. Смысла ты не видишь, потому что сам уже не знаешь за что зацепиться, и что сказать хотел

Не пей так больше, до НГ ещё далеко.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352632
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСпрашиваю, что тебе не понятно в приведённом примере, чего не хватает
Я уже отвечал, мне ничего непонятно. Нужна модель, маппинги, нужен реальный рабочий пример, а не огрызки. Такой пример, какие всегда даю я и некоторые другие участники форумов . Где взял код, вставил в одата сервис и заработало. Но ты не в состоянии привести рабочий вариант.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352642
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СмузиЯ уже отвечал, мне ничего непонятно. Нужна модель, маппинги, нужен реальный рабочий пример, а не огрызки. Такой пример, какие всегда даю я и некоторые другие участники форумов . Где взял код, вставил в одата сервис и заработало. Но ты не в состоянии привести рабочий вариант.

Модель, маппинги, реальные рабочие примеры — этого всего по теме хоть одним местом жуй. Не моя проблема, что ты не в состоянии нагуглить полноценных рабочих примеров. Пример, который я привёл отлично поясняет мою мысль, если бы у тебя были вопросы, ты бы их задал, были бы замечания, ты бы сказал.
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39352867
баз лайтер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
накину еще немного:
чтобы сохранять объекты ReverseMap не подойдет, так как нужно разрешать id из имен
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public IHttpActionResult Post([FromBody]ProductDto dto)
        {
            var category = db.Categories.FirstOrDefault<Dictionary.Category>(a => a.Name == dto.Category);
            var product = db.Products.Find(new object[] { dto.Id });
            if (null == product)
            {
                product = new Product {
                   Name = dto.Name
                  ,CategoryId = category.Id
                  //eще 100 строк
                }
                db.Products.Add(product);
            }
            else {
                product.CategoryId = category.id;
                product.Name = dto.Name;
                //eще 100 строк
                db.Entry(product).State = EntityState.Modified;
            }
            db.SaveChanges();
            return Created(dto);
        }
...
Рейтинг: 0 / 0
oData - лукап проперти
    #39355488
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баз лайтерReverseMap

Неправильный подход, либо Update, либо Create, в теминах REST это или PUT или POST, как совершенно отдельные операции.

Делать Update-OR-Create в одном методе POST на мой взгляд — ошибка проектирования, с которой придётся не раз поиметь много-много проблем. То, что на первый взгляд выглядит упрощением, выльется в каскадный ворох проблем.

Никогда не рекомендую так делать. Создание это создание, изменение это изменение. У них может быть совершенно разная логика и скорее всего со временем будет.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / oData - лукап проперти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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