У меня есть запрос к базе данных, который выглядит следующим образом:
var userHasProfessions = xy.GetUserProfessions();
var users = sessionService.GetDefaultSession()
.Query<User>()
.Where(a => userProfessions.Contains(a.Profession.Id))
.ToList();
Он получает всех пользователей, которых запрашивающий пользователь может видеть, в зависимости от его профессии. Теперь я хочу немного ограничить это, чтобы он мог видеть только некоторые атрибуты пользователей. Скажем, например:
id -> yes
firstname -> yes
lastname -> yes
address -> no!
Теперь я попытался изменить запрос на что-то вроде:
var userHasProfessions = xy.GetUserProfessions();
var users = sessionService.GetDefaultSession()
.QueryOver<User>()
.SelectList(list => list
.Select(a => a.id)
.Select(a => a.firstname)
.Select(a => a.lastname))
.Where(a => userProfessions.Contains(a.Profession.Id))
.ToList();
Теперь мой вопрос ... Есть ли способ, например, создать новый список с этими атрибутами, а затем просмотреть его? Что-то вроде того:
List<string> attributes = new List<string>(){"id", "firstname", "lastname"}
var userHasProfessions = xy.GetUserProfessions();
var users = sessionService.GetDefaultSession()
.QueryOver<User>()
.SelectList(
//loop through attributes
)
.Where(a => userProfessions.Contains(a.Profession.Id))
.ToList();
Заранее спасибо :-)
РЕДАКТИРОВАТЬ
Чтобы сделать мой вопрос немного более ясным. Я хочу иметь атрибуты, которые пользователь может видеть, динамически изменяемые с List<string> вне запроса.
Как этого добиться?
@DavidG Спасибо !, ваше решение будет работать, но только если жестко закодировать атрибуты в запросе. Хочу вынести их в отдельный список.
Я действительно не понимаю, о чем вы здесь спрашиваете. Вы хотите динамически запрашивать столбцы?
@DavidG Точно, я хочу иметь список атрибутов, которые должен видеть пользователь. Этот список переменный. Это означает, что запрос должен динамически изменять разрешенные атрибуты.
Тогда вы хотите использовать Dynamic Linq, что я бы категорически не рекомендовал. Менять нужные столбцы почти никогда не нужно.
@DavidG Можете ли вы дать мне полезный пример, как это сделать с динамическим LINQ? Может быть, в качестве ответа, чтобы я одобрил это.
Не на самом деле нет. Проблема в том, что даже анонимные типы создаются во время компиляции. Есть несколько хитрых решений здесь, но, как я уже сказал выше, вы действительно уверены, что вам это нужно?
@DavidG На самом деле мне это нужно, потому что я должен отображать разные атрибуты пользователям в разных ролях ...





Ты мог бы сделать
.Where(a => userProfessions.Contains(a.Profession.Id))
.Select(c => new User {
id = c.id,
firstname = c.firstname,
lastname = c.lastname,
address c.address
}).ToList();
Я предполагаю, что список - это тип User. В противном случае вы можете использовать анонимный возврат i.d. c => new { id = "id",... }
Нет Список - это тип строки. Я намерен иметь список извне в переменной, поэтому мне не нужно жестко кодировать их в запросе. Есть еще идеи?
@ RaphaelMüller, каков ваш ожидаемый результат
Я ожидаю, что пользовательская модель будет выглядеть в JSON как [{"id":1,"firstname":"Paul","lastname":"Paulsen","address":null}] или без адреса, это не так важно.
@ RaphaelMüller, .Select(u => new { u.id, u.firstname, u.lastname}) в этом случае подойдет
Я ничего не знаю о NHibernate, а вы не можете сделать
sessionService.GetDefaultSession().QueryOver<User>().Select(u => new { u.id, u.firstname, u.lastname})?