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<string>
动态更改。
如何做到这一点?
【问题讨论】:
我对NHibernate一无所知,但你不能sessionService.GetDefaultSession().QueryOver<User>().Select(u => 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 => new id="id",...
【讨论】:
No List 是字符串类型。我的意图是将列表外部放在一个变量中,因此我不必在查询中对它们进行硬编码。还有其他想法吗? @RaphaelMüller,你的预期输出是什么 我希望用户模型在 JSON 中看起来像["id":1,"firstname":"Paul","lastname":"Paulsen","address":null]
或没有地址,这并不重要。
@RaphaelMüller, .Select(u => new u.id, u.firstname, u.lastname)
在这种情况下可以工作以上是关于NHibernate .SelectList() 与 C# 中的 List<string>的主要内容,如果未能解决你的问题,请参考以下文章
从SelectList获取MultiSelectList的SelectListItems