1

抱歉,我是 NHibernate 的新手,希望我不会因为这个问题而让自己难堪。

我分别在 Logs 和 UserProfiles 表中有 2 个对象,一个 Log 和一个 UserProfile。每个 Log 对象引用一个或不引用一个 UserProfile 对象。

我想要一种从日志表中收集不同UserProfile.UserName字符串列表的有效方法,按字母顺序排列。使用 Linq,这相当简单,但我希望在数据库端完成此操作。我会怎么做

public IEnumerable<string> GetUserNamesInLogs(){}

看起来像?

如果我用 SQL 写这个,我会做这样的事情:

select distinct
    u.UserName
from
    Logs as l
inner join
    UserProfiles as u
    on u.UserId = l.UserId;

我正在寻找 NHibernate 中的等价物。我想我不想为此延迟加载(这似乎是性能消耗),但我可能不清楚延迟加载的工作原理。

4

3 回答 3

2

jbl答案的一些优化:

UserProfile userProfileAlias = null;
Log logAlias = null;

session.QueryOver(() => userProfileAlias)
              .JoinAlias(() => userProfileAlias.Logs, () => logAlias)
              .Select(
                  Projections.Distinct(Projections.Property(() => userProfileAlias.Name))))
              .OrderBy(() => userProfileAlias.Name).Asc
              .List<string>();
于 2012-04-20T21:12:10.123 回答
1

没有类和映射很难回答。假设您在UserProfile类中映射了与 UserProfile 的 Logs 对应的Logs集合属性,则 UserProfile 的类和映射应如下所示:

public class UserProfile
{
...

public virtual IList<Log> Logs {get;set;}

...
}


<?xml version="1.0" encoding="utf-8" ?>
   <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" >
  <class name="blabla.UserProfile, blabla" table="UserProfiles">

  .....
  <bag name="Logs" fetch="select" inverse="true" access="property" lazy="true">
    <key column="UserId"/>
    <one-to-many class="blabla.Log, blabla"/>
  </bag>

............

,你可以尝试这样的事情:

UserProfile upAlias=null;

var result = yourNHSession.QueryOver<UserProfile>(() => upAlias)
              .JoinQueryOver(x => x.Logs)
              .Select(
                  Projections.Distinct(
                     Projections.ProjectionList()
                     .Add(Projections.Property<UserProfile>(x=>x.Name))))
              .OrderBy(() => upAlias.Name)
              .Asc
              .List<String>().ToList();
于 2012-04-20T12:43:02.873 回答
0

完全没能按照我希望的方式使用标准,我作弊了:

var result = _Session.CreateQuery("select distinct profile.UserName from Log as l inner join l.UserProfile as profile order by profile.UserName asc")
    .List<string>();

这给了我想要的结果。感谢那些帮助过的人。

于 2012-04-22T14:41:01.150 回答