NHibernate .SelectList () со списком <string> в C#

У меня есть запрос к базе данных, который выглядит следующим образом:

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> вне запроса.

Как этого добиться?

Я ничего не знаю о NHibernate, а вы не можете сделать sessionService.GetDefaultSession().QueryOver<User>().Select(‌​u => new { u.id, u.firstname, u.lastname})?

DavidG 19.06.2018 11:19

@DavidG Спасибо !, ваше решение будет работать, но только если жестко закодировать атрибуты в запросе. Хочу вынести их в отдельный список.

user8289962 19.06.2018 11:59

Я действительно не понимаю, о чем вы здесь спрашиваете. Вы хотите динамически запрашивать столбцы?

DavidG 19.06.2018 12:02

@DavidG Точно, я хочу иметь список атрибутов, которые должен видеть пользователь. Этот список переменный. Это означает, что запрос должен динамически изменять разрешенные атрибуты.

user8289962 19.06.2018 12:04

Тогда вы хотите использовать Dynamic Linq, что я бы категорически не рекомендовал. Менять нужные столбцы почти никогда не нужно.

DavidG 19.06.2018 12:06

@DavidG Можете ли вы дать мне полезный пример, как это сделать с динамическим LINQ? Может быть, в качестве ответа, чтобы я одобрил это.

user8289962 19.06.2018 16:06

Не на самом деле нет. Проблема в том, что даже анонимные типы создаются во время компиляции. Есть несколько хитрых решений здесь, но, как я уже сказал выше, вы действительно уверены, что вам это нужно?

DavidG 19.06.2018 16:13

@DavidG На самом деле мне это нужно, потому что я должен отображать разные атрибуты пользователям в разных ролях ...

user8289962 19.06.2018 16:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
439
1

Ответы 1

Ты мог бы сделать

.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",... }

Нет Список - это тип строки. Я намерен иметь список извне в переменной, поэтому мне не нужно жестко кодировать их в запросе. Есть еще идеи?

user8289962 19.06.2018 12:01

@ RaphaelMüller, каков ваш ожидаемый результат

Manoz 19.06.2018 12:46

Я ожидаю, что пользовательская модель будет выглядеть в JSON как [{"id":1,"firstname":"Paul","lastname":"Paulsen","address":n‌​ull}] или без адреса, это не так важно.

user8289962 19.06.2018 12:53

@ RaphaelMüller, .Select(u => new { u.id, u.firstname, u.lastname}) в этом случае подойдет

Manoz 19.06.2018 14:13

Другие вопросы по теме