从NHibernate中的相关表中选择不同的值集

时间:2012-04-20 02:42:01

标签: c# nhibernate nhibernate-criteria

对不起我是NHibernate的新手我希望我不会因为这个问题而难堪。

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

我想要一种从Logs表中收集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中的等价物。我想我不希望延迟加载(这似乎是性能消耗)但我可能不清楚延迟加载是如何工作的。

3 个答案:

答案 0 :(得分: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>();

答案 1 :(得分:1)

没有类和映射很难回答。 假设您在 UserProfile 类中映射了与UserProfile的日志对应的 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();

答案 2 :(得分:0)

我完全没有按照Criteria的方式让我的工作方式失效,我作弊:

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>();

这给了我正在寻找的结果。感谢那些帮助过的人。