Linq2Sql - хранение сложных запросов Linq для будущего динамического выполнения - необработанный текст - возможно? - PullRequest
4 голосов
/ 13 октября 2009

Мне очень весело с 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, хотя.

Заранее спасибо!

1 Ответ

3 голосов
/ 13 октября 2009

Возможно, поможет Динамическая библиотека LINQ (в примерах MSDN)?

В частности, использование как: .Where(3"">

Это должно работать с любым IQueryable<T> источником, включая LINQ-to-Objects, просто вызывая .AsQueryable() в последовательности (обычно IEnumerable<T>).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...