NHibernate .SelectList() 与 C# 中的 List<string>

Posted

技术标签:

【中文标题】NHibernate .SelectList() 与 C# 中的 List<string>【英文标题】:NHibernate .SelectList() with List<string> in C# 【发布时间】:2018-11-28 04:43:40 【问题描述】:

我有一个如下所示的数据库请求:

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&lt;string&gt; 动态更改。

如何做到这一点?

【问题讨论】:

我对NHibernate一无所知,但你不能sessionService.GetDefaultSession().QueryOver&lt;User&gt;().Select(u =&gt; new u.id, u.firstname, u.lastname)吗? @DavidG 谢谢!,您的解决方案将有效,但前提是对查询中的属性进行硬编码。我想把它们放到一个单独的列表中。 我真的不明白你在这里问什么。您是否希望动态查询列? @DavidG 没错,我想要一个用户应该看到的属性列表。这个列表是可变的。这意味着查询应该动态更改允许的属性。 那么您希望使用我强烈反对的 Dynamic Linq。几乎不需要更改您需要的列。 【参考方案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 的类型。否则,您可以使用匿名返回 ID。 c =&gt; new id="id",...

【讨论】:

No List 是字符串类型。我的意图是将列表外部放在一个变量中,因此我不必在查询中对它们进行硬编码。还有其他想法吗? @RaphaelMüller,你的预期输出是什么 我希望用户模型在 JSON 中看起来像 ["id":1,"firstname":"Paul","lastname":"Paulsen","address":null] 或没有地址,这并不重要。 @RaphaelMüller, .Select(u =&gt; new u.id, u.firstname, u.lastname) 在这种情况下可以工作

以上是关于NHibernate .SelectList() 与 C# 中的 List<string>的主要内容,如果未能解决你的问题,请参考以下文章

从SelectList获取MultiSelectList的SelectListItems

使用没有角色的用户呈现 SelectList

Linq 多个连接到 SelectList

将默认选项添加到 SelectList 不起作用

在 ASP.NET Core 的 SelectList 中显示数据

在 SelectList 中设置自定义文本字段