Есть простые DTO классы (например Тех.Паспорт, Автомобиль, Владелец и т.д.), есть ORM (sqlite-net), которая отражает таблицы из реляционной БД на списки объектов этих классов (например список всех автомобилей, у которых владельцы старше 25 лет).
Как правильно заполнить датагрид, если помимо данных основного класса нужны данные справочных классов (отобразить автомобили, их владельцев и их тех. паспорта)?
Т.к. DataSource может принимать IEnumerable, то собрал вот такой LINQ-запрос:
var db = new SQLiteConnection("testdb.db3");
var joinedData = from c in db.Table<Car>().ToList<Car>()
join p in db.Table<TehPasport>().ToList<TehPasport>() on c.vin equals p.vin
join o in db.Table<Owner>().ToList<Owner>() on o.vin equals c.vin
select new { c.Vin, p.Number, o.FirstName };
BindingSource bindingSource1 = new BindingSource();
bindingSource1.DataSource = joinedData;
dataGridView1.DataSource = bindingSource1;
Вроде все устраивает, но тогда отпадает дизайнер таблицы, т.е. я не могу нарисовать колонки, наименовать их, расставить обработчики, сортировку и т.д. Только рантайм. Или нет?
Как вариант могу нарисовать некий производный класс, в котором соберу нужные поля из нескольких классов, который будет соответствовать конкретному DataGrid. Привяжусь к нему в дизайн тайме, а потом отображу свой IEnumerable на этот сводный класс.
Но это решение мне не очень нравится, кода больше, причем дублирующегося.
Подскажите как обычно поступают в таких случаях?