2

我有一个 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>对象,我会更喜欢,特别是因为查询永远不会返回一个以上的用户配置文件。可以做到这一点,还是我坚持额外的步骤?

4

2 回答 2

1

如果您映射导航的另一侧,例如UserProfile在类上有一个属性UserMessage,您可以从UserMessage

var messages = 
    from UserMessage um in _Session.Query<UserMessage>()
    where um.UserProfile.UserName == userName
    select um;

否则你需要使用SelectMany()来得到一个扁平化的列表。

于 2012-09-01T15:18:12.657 回答
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);
于 2012-09-01T15:22:36.230 回答