Hi,
У нас в программе используется контрол
ComponentOne Query™ 8.0
С помощью него пользователь в программе может выбрать таблички, колонки в этих табличках, указать различные условия (типа where) и выбрать интересующие его данные из БД.
Этот контрол является query builder'ом — он по заранее заданной xml-схеме таблиц, связей и по выбору пользователя позволяет строить sql-select.
Этот контрол умеет работать с таблицами и вьюхами. Нам сейчас стало не хватать функциональности этого контрола. В частности нужно джойнить на sql-function...
Первая идея — заменить контрол.
Нашёл парочку:
http://www.activequerybuilder.com/screenshots.html
http://devtools.korzh.com/eq/dotnet
Оба не подошли по ряду причин.
Может кто-то посоветует другой query builder контрол с простым юзер интерфейсом?
Как вариант подумываем написать свой контрол.
Решил попробовать использовать Linq to Sql для этого.
Нашёл библиотеку dynamic LINQ, с помощь неё очень удобно формировать динамические WHERE и SELECT.
Проблема возникла с Join.
Например есть таблицы Customers и Products. Есть sql-function fn_GetProducts(), которая выбирает все продукты. Для примера будем считать, что связь один к одному: один Customer — один Product.
Выборка Customers Left join Products будет выглядеть так:
var a = db.Customers
.GroupJoin(db.fn_GetProducts(), c => c.ID, p => p.ID, (c, ps) => new {c.ID, c, ps})
.SelectMany(@t => @t.ps.DefaultIfEmpty(), (@t, p) => new {@t.c.ID, @t.c.Name, p.Description});
Мне надо как-то цеплять join'ы динамически. То есть что-то похожее на:
Сделать Linq для выбора Customers. Что-то типа IQueryable<Customer> q = db.Customers.Select(c => c);
IF (пользователь чекнул "вместе с продуктами")
{
тут добавить join на fn_GetProducts()
}
IF (пользователь чекнул "вместе с ещё чем-то")
{
тут добавить join на fn_GetЕщёЧтото()
}
и т.д.
Как такое можно реализовать? И можно ли?
И в целом как думаете, стоит использовать LINQ to SQL для этих целей?
Спасибо. Если не за ответ, то хотя б за то, что дочитали до конца