Целесообразно ли использовать LINQ to SQL для такой задачи?
От: Аноним  
Дата: 03.08.10 13:33
Оценка:
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 для этих целей?

Спасибо. Если не за ответ, то хотя б за то, что дочитали до конца
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.