Мне очень весело с Linq2Sql. Деревья выражений были великолепны, и просто стандартный синтаксис Linq2Sql был очень увлекательным.
Теперь я дошел до части своего приложения, где мне нужно каким-то образом хранить запросы в базе данных, которые настраиваются для разных клиентов, использующих одну и ту же базу данных и одни и те же таблицы (хорошо, но вы знаете, что я имею в виду). По сути, я ничего не могу жестко закодировать, и мне нужно оставить текст запроса открытым текстом, чтобы кто-то мог написать новый запрос типа where-предложения.
Итак, если это описание было грубым, позвольте мне уточнить:
В предыдущей версии нашего приложения мы использовали прямые вызовы SQL к базе данных с использованием необработанного SQL. Да. это было весело, грязно, и это сработало. У нас будет таблица базы данных, заполненная различными критериями, такими как
(EventType = 6 and Total > 0)
или стиль подзапроса
(EventType = 7
AND Exists (
select *
from events as e1
where events.EventType = e1.EventType
and e1.objectNumber = 89)
)
(впрыск sql?)
В Linq2Sql это немного сложнее. Я могу сделать все эти запросы без проблем в CLR, но возможность передавать динамически там, где критерии для Linq, немного сложнее, особенно если я хочу выполнить подзапрос (как в примере выше).
Некоторые идеи у меня были:
Получите необработанное выражение и сохраните его - но я понятия не имею, как взять необработанное текстовое выражение и повернуть его обратно к выражению исполняемого объекта.
Напишите язык, похожий на SQl, и пусть он проанализирует код и сгенерирует выражение Linq - вау, это может быть очень весело
Я совершенно уверен, что нет SomeIqueryable.Where("EventType = 6 and Total > 54")
. Я читал, что это было доступно в бета-версии, но я не вижу, как вы можете сделать это сейчас.
var exp2 = context.POSDataEventView.Where("EmployeeNumber == @0", 8310);
Это был бы самый простой способ для меня развернуть .. Я думаю.
Хранить сериализованные выражения - вау ... это может сбить с толку пользователя, пытающегося написать запрос - черт, я не уверен, что смогу даже напечатать все это.
Итак, я ищу некоторые идеи о том, как я могу сохранить запрос в каком-то виде открытого текста, а затем каким-то образом выполнить его для моих объектов Linq2Sql, не вызывая ExecuteSQL. Я хочу использовать LinqObjects.
P.S. Я использую pLinqo для этого приложения, если это помогает. Это все еще linq2sql, хотя.
Заранее спасибо!