WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 21.09.20 15:12
Оценка:
Добрый день,

Есть проект WPF Core. На форме лежит DevExpress GridControl. Источник данных — ITable<MyDateMain> от linq2db. Некоторые колонки используют LookUpEdit для отображения подчиненных гридов. И вот тут начинаются сложности, потому что данные для подчиненных гридов должны запрашиваться в БД на основе нескольких полей из главенствующего грида.
Если бы в xaml можно было написать что-то вроде {Binding MyDateSub1(RowData.Row.Row)} это решило бы проблему, но, насколько я знаю — так сделать нельзя.
Можно попытаться наследоваться от MyDateMain внеся туда свойства вызывающие подчиненные данные. Но я не очень представляю как из ITable<MyDateMain> сделать ITable<MyDateMainChild>. Нет, можно, конечно что-то типа .select(d=>new MyDateMainChild(d)) , но строк в запросе довольно много и сколько будет время проводиться переработка — вопрос.

Как решить проблему?
Re: WPF, linq2db, Binding и зависимые данные
От: Danchik Украина  
Дата: 21.09.20 17:24
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>Добрый день,


CR>Есть проект WPF Core. На форме лежит DevExpress GridControl. Источник данных — ITable<MyDateMain> от linq2db. Некоторые колонки используют LookUpEdit для отображения подчиненных гридов. И вот тут начинаются сложности, потому что данные для подчиненных гридов должны запрашиваться в БД на основе нескольких полей из главенствующего грида.

CR>Если бы в xaml можно было написать что-то вроде {Binding MyDateSub1(RowData.Row.Row)} это решило бы проблему, но, насколько я знаю — так сделать нельзя.
CR>Можно попытаться наследоваться от MyDateMain внеся туда свойства вызывающие подчиненные данные. Но я не очень представляю как из ITable<MyDateMain> сделать ITable<MyDateMainChild>. Нет, можно, конечно что-то типа .select(d=>new MyDateMainChild(d)) , но строк в запросе довольно много и сколько будет время проводиться переработка — вопрос.

CR>Как решить проблему?


Сумбурно как-то, зачем LookupEdit для отображения?
Я лет 10 не залазил в UI, и понять не могу чего вы добиваетесь.
Если что, меняйте DataSource для LookupEdit при изменении текущей строки.
Re[2]: WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 21.09.20 17:28
Оценка:
Здравствуйте, Danchik, Вы писали:
D>Сумбурно как-то, зачем LookupEdit для отображения?
Для создания подчиненных гридов из ячейки родительского.
D>Я лет 10 не залазил в UI, и понять не могу чего вы добиваетесь.
А зачем тогда советуете?
D>Если что, меняйте DataSource для LookupEdit при изменении текущей строки.
Как вы себе это представляете?
Re: WPF, linq2db, Binding и зависимые данные
От: VladCore  
Дата: 21.09.20 17:37
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>Добрый день,


CR>Есть проект WPF Core. На форме лежит DevExpress GridControl. Источник данных — ITable<MyDateMain> от linq2db.


Юзать модель БД для модели Грида — плохая идея.

CR>Некоторые колонки используют LookUpEdit для отображения подчиненных гридов. И вот тут начинаются сложности, потому что данные для подчиненных гридов должны запрашиваться в БД на основе нескольких полей из главенствующего грида.


Или 1) в LookUpEdit.Value совать все необходимые поля строки. В этом случае будет один Editor-он каждую колонку грида.
Или 2) Генерировать для каждой ячейки свой едитор в момент Popup-а. Это геморно и тормозить может.

CR>Как решить проблему?


Для начала перестать юзать одну модель и для БД и для Грида
Re[2]: WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 21.09.20 17:53
Оценка:
VC>Юзать модель БД для модели Грида — плохая идея.
Поясните.

VC>Или 1) в LookUpEdit.Value совать все необходимые поля строки. В этом случае будет один Editor-он каждую колонку грида.

Не понял, если честно.

VC>Или 2) Генерировать для каждой ячейки свой едитор в момент Popup-а. Это геморно и тормозить может.

Editor прописывается в xaml . Не вижу смысла его динамически генерировать.

VC>Для начала перестать юзать одну модель и для БД и для Грида

См.выше — поясните свою мысль.
Re[3]: WPF, linq2db, Binding и зависимые данные
От: Danchik Украина  
Дата: 21.09.20 17:55
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>Здравствуйте, Danchik, Вы писали:

D>>Сумбурно как-то, зачем LookupEdit для отображения?
CR>Для создания подчиненных гридов из ячейки родительского.
D>>Я лет 10 не залазил в UI, и понять не могу чего вы добиваетесь.
CR>А зачем тогда советуете?

Ничерта я не советую, потому что вопрос непонятен. Хоть картинку бы запостил.
А советую потому что собаку на этом скушал и в принципе понимаю как грид работает.

D>>Если что, меняйте DataSource для LookupEdit при изменении текущей строки.

CR>Как вы себе это представляете?

Во первых дайте линку с какого перепугу LookupEdit должен показывать подчиненные гриды. Это же редактор.
Такое, я бы еще понял https://docs.devexpress.com/WPF/119851/controls-and-libraries/data-grid/master-detail/data-grid-in-details
Re[4]: WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 21.09.20 18:06
Оценка:
D>Во первых дайте линку с какого перепугу LookupEdit должен показывать подчиненные гриды. Это же редактор.
Нате https://supportcenter.devexpress.com/ticket/details/t932850/child-grid-for-every-cell
Рекомендация использования LookUpEdit выдана официальной поддержкой DevExpress

D>Такое, я бы еще понял https://docs.devexpress.com/WPF/119851/controls-and-libraries/data-grid/master-detail/data-grid-in-details

Это Master-Detail. Один подчиненный грид на строку. А нужен разный подчиненный на разные колонки (ячейки)
Re[5]: WPF, linq2db, Binding и зависимые данные
От: Danchik Украина  
Дата: 22.09.20 05:27
Оценка:
Здравствуйте, CyberRussia, Вы писали:

D>>Во первых дайте линку с какого перепугу LookupEdit должен показывать подчиненные гриды. Это же редактор.

CR>Нате https://supportcenter.devexpress.com/ticket/details/t932850/child-grid-for-every-cell
CR>Рекомендация использования LookUpEdit выдана официальной поддержкой DevExpress

Какой-то приватный линк, скриншот что-ли сделайте

D>>Такое, я бы еще понял https://docs.devexpress.com/WPF/119851/controls-and-libraries/data-grid/master-detail/data-grid-in-details

CR>Это Master-Detail. Один подчиненный грид на строку. А нужен разный подчиненный на разные колонки (ячейки)

В ячейку вывести имя, а не ID? У меня такое чувство что мы в терминах путаемся.
Re[6]: WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 22.09.20 06:01
Оценка:
D>Какой-то приватный линк, скриншот что-ли сделайте
D>В ячейку вывести имя, а не ID? У меня такое чувство что мы в терминах путаемся.

Два скриншота из Demo Center от DevExpress — Multi-Column Lookup Cell Editor
http://files.rsdn.org/57699/code.png — UI
http://files.rsdn.org/57699/code.png — Code (фрагмент)

На скриншоте не видно шаблона подчиненного грида, но LookUpEditSettings ссылается на него.

Но вопрос в подключении данных, то ли создавать единый класс содержаний в себя все данные по строке, включая подчененные гриды. То ли как-то по другому работать с Binding а не RowData.Row.DataGridSub1
Re[7]: WPF, linq2db, Binding и зависимые данные
От: Danchik Украина  
Дата: 22.09.20 08:04
Оценка:
Здравствуйте, CyberRussia, Вы писали:

D>>Какой-то приватный линк, скриншот что-ли сделайте

D>>В ячейку вывести имя, а не ID? У меня такое чувство что мы в терминах путаемся.

CR>Два скриншота из Demo Center от DevExpress — Multi-Column Lookup Cell Editor

CR>http://files.rsdn.org/57699/code.png — UI
CR>http://files.rsdn.org/57699/code.png — Code (фрагмент)

CR>На скриншоте не видно шаблона подчиненного грида, но LookUpEditSettings ссылается на него.


CR>Но вопрос в подключении данных, то ли создавать единый класс содержаний в себя все данные по строке, включая подчененные гриды. То ли как-то по другому работать с Binding а не RowData.Row.DataGridSub1


Если только для отображения — однозначно прокидывать все колонки в запрос. Иначе будут невиданные тормоза. Для IQueryable это не проблема если грид потом сам делает проекцию.

Но есть и другой вариант:
Если T4 шаблон смог подхватить ваши FK, то у вашей модели есть ассоциации, а ассоциации должны легко байндится в таком виде

cityColumn.FieldName = "Address.City";


https://supportcenter.devexpress.com/ticket/details/t321581/how-to-show-navigation-property-properties-in-a-repositoryitemlookupedit/
Re[8]: WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 22.09.20 12:33
Оценка:
D>Если только для отображения — однозначно прокидывать все колонки в запрос. Иначе будут невиданные тормоза. Для IQueryable это не проблема если грид потом сам делает проекцию.
Запрос на основе которого строится основной грид сейчас выдает примерно 400 000 записей. В трех подчиненных гридах примерно по 100, и в двух по 10 на каждую строку родительского. Я боюсь, что если это все в один запрос свести, то пользователь просто не дождется результата.

D>Но есть и другой вариант:

D>Если T4 шаблон смог подхватить ваши FK, то у вашей модели есть ассоциации, а ассоциации должны легко байндится в таком виде
Не подумал о таком. Посмотрю, когда доберусь до рабочего компа, но есть сомнения. Запросы строились на основе View БД, так что ассоциации в linq2db могли и не появиться.
Re[9]: WPF, linq2db, Binding и зависимые данные
От: Danchik Украина  
Дата: 22.09.20 13:34
Оценка:
Здравствуйте, CyberRussia, Вы писали:

D>>Если только для отображения — однозначно прокидывать все колонки в запрос. Иначе будут невиданные тормоза. Для IQueryable это не проблема если грид потом сам делает проекцию.

CR>Запрос на основе которого строится основной грид сейчас выдает примерно 400 000 записей. В трех подчиненных гридах примерно по 100, и в двух по 10 на каждую строку родительского. Я боюсь, что если это все в один запрос свести, то пользователь просто не дождется результата.

Я что-то путаюсь. При чему тут подчиненный грид? Выдаете данные в одну строку?

Или у вас рядом лежит еще парочка гридов (уже телепатия какая-то)

D>>Но есть и другой вариант:

D>>Если T4 шаблон смог подхватить ваши FK, то у вашей модели есть ассоциации, а ассоциации должны легко байндится в таком виде
CR>Не подумал о таком. Посмотрю, когда доберусь до рабочего компа, но есть сомнения. Запросы строились на основе View БД, так что ассоциации в linq2db могли и не появиться.

Тогда их можно ручками задавать.
Re[10]: WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 22.09.20 13:43
Оценка:
D>Я что-то путаюсь. При чему тут подчиненный грид? Выдаете данные в одну строку?
D>Или у вас рядом лежит еще парочка гридов (уже телепатия какая-то)

Есть грид. Основной. Он же родительский. Основа — примерно 400 000 записей в БД.
Клик на ячейку — открывается новый грид (подчиненный), новый запрос в БД с параметрами из строки родительского грида. Разные столбцы — разные структуры подчиненных гридов, разные (в разные view) запросы к БД. Разные строки — разные параметры для запроса. Примерно на каждый такой грид — 100 записей из БД.
Re[11]: WPF, linq2db, Binding и зависимые данные
От: Danchik Украина  
Дата: 22.09.20 14:14
Оценка:
Здравствуйте, CyberRussia, Вы писали:

D>>Я что-то путаюсь. При чему тут подчиненный грид? Выдаете данные в одну строку?

D>>Или у вас рядом лежит еще парочка гридов (уже телепатия какая-то)

CR>Есть грид. Основной. Он же родительский. Основа — примерно 400 000 записей в БД.

CR>Клик на ячейку — открывается новый грид (подчиненный), новый запрос в БД с параметрами из строки родительского грида. Разные столбцы — разные структуры подчиненных гридов, разные (в разные view) запросы к БД. Разные строки — разные параметры для запроса. Примерно на каждый такой грид — 100 записей из БД.

Тогда тому подчиненному гриду надо менять DataSource на клик или на смену строки — тут фильтруете уже по значениям с мастер грида, фактически новый IQueryable. Как бы логично.
Сомневаюсь что LookupEdit делает это автоматом

Вот кстати и похожий тикет, и даже ивент сказали на какой вешаться
https://supportcenter.devexpress.com/ticket/details/q264466/detailsview-lookupedit-based-on-another-detailsview
Re[12]: WPF, linq2db, Binding и зависимые данные
От: CyberRussia  
Дата: 22.09.20 14:28
Оценка:
D>Тогда тому подчиненному гриду надо менять DataSource на клик или на смену строки — тут фильтруете уже по значениям с мастер грида, фактически новый IQueryable. Как бы логично.
D>Сомневаюсь что LookupEdit делает это автоматом

D>Вот кстати и похожий тикет, и даже ивент сказали на какой вешаться

D>https://supportcenter.devexpress.com/ticket/details/q264466/detailsview-lookupedit-based-on-another-detailsview

Ага. Я так для WinForms и ASP.NET писал. А вот в WPN с его XAML было желание обойтись именно XAML с Binding и соответствующей моделью.

В текущей реализации создал класс наследник от MyDateMain
    public class MyDateMainEx : MyDateMain, IDisposable
    {
        public Data { get; set; }
        public MyDateMainEx(MyDateMain DataParent): base()
        {
            Data = DataParent;
        }
...

В который под видом публичных свойств прописал методы вызовы IQuarberly для подчиненных гридов, типа
        public IQueryable<Akkreport> TickerClose
        {
            get {
                           _tickerClose = connectDBTickerClose.Akkreports.Where(a => a.Ticker == Data.Ticker && a.Dimenstion == Data.Dimenstion && a.Quarterly == Data.Quarterly && a.Year == Data.Year);
        }
    }

И соответственно коллекция для родительского грида создается из запроса к БД как
_mainReport = connectDBReport.MyDateMain.Select(s => new MyDateMainEx(s));


Тогда в XAML можно прописывать для LookUpEdit.ItemsSource = { Binding DataRow.Row.TickerClose }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.