我有一个Linq to NHibernate查询,如下所示:
var profile =
from UserProfile up in _Session.Query<UserProfile>()
.Fetch(x=>x.Messages)
where up.UserName == userName
select up.Messages;
这将返回IQueryable<IList<UserMessage>>
,然后我必须运行SelectMany()
。我更喜欢我可以只返回一个IQueryable<UserMessage>
对象,特别是因为查询永远不会返回多个用户配置文件。可以这样做,还是我坚持额外的步骤?
答案 0 :(得分:1)
如果您映射导航的另一侧,例如UserProfile
课程上有UserMessage
属性,则可以从UserMessage
开始:
var messages =
from UserMessage um in _Session.Query<UserMessage>()
where um.UserProfile.UserName == userName
select um;
否则,您需要使用SelectMany()
来获取展开的列表。
答案 1 :(得分:1)
您可以直接查询消息表并使用反向关联吗?
IQueryable<Message> messages = ...;
var filtered = from m in messages
where m.UserProfile.UserName == userName
select m;
此外,如果您愿意放弃查询语法,可以使用以下内容缩短查询时间:
var profile = _Session.Query<UserProfile>()
.Where(up => up.UserName == userName)
.SelectMany(up => up.Messages);