Динамическое изменение столбцов LINQ to SQL Select - PullRequest
1 голос
/ 30 ноября 2009

Я пытаюсь создать REST-ful API для моего приложения. В настоящее время у меня есть что-то вроде этого:
www.example.com/submissions/?format=json

Это вернет последние десять представлений в формате JSON. Каждый объект имеет свои данные, такие как имя отправителя, дата создания, пользователь, тело и т. Д.

Я бы хотел сделать что-то вроде:
www.example.com/submissions/?format=json&filter=name,user

Фильтр должен сделать запрос на возврат того же результата, но включить только упомянутые детали, т.е. каждый объект будет иметь только имя и пользователя.

Это довольно просто с точки зрения вывода JSON. Я могу загрузить все столбцы из базы данных и создать и сериализовать объект, который будет включать только столбцы в фильтре. Однако я не хочу загружать все столбцы в базе данных - Я хочу беспокоить свою базу данных только столбцами, которые я включу в ответ .

Я хочу сделать что-то вроде этого:

var result = from record in Submissions
             select
             {
                Name,
                Date,
                User,
                Body
             };

Теперь у меня есть объект result, который является IQueryable, поэтому пока еще не выполнен вызов базы данных.

Затем я должен изучить строку запроса filter и исключить столбцы, которые не упомянуты.

Наконец, я могу выполнить оператор select с чем-то вроде
JavaScript.Serialize(result.ToList());

Возможно ли это с помощью LINQ to SQL?

Ответы [ 2 ]

3 голосов
/ 30 ноября 2009

Альтернативой созданию дерева выражений Select вручную является Dynamic LINQ , который предоставляет метод Select, который принимает строку:

var filter = "name,user";
var result = Submissions.Select("new(" + filter + ")");

Затем строка преобразуется в дерево выражений и передается поставщику запросов.

1 голос
/ 30 ноября 2009

Да. Вы хотите исследовать Изменение деревьев выражений . В частности, выражение MemberInit .

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