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

本文关键字:选择 NHibernate | 更新日期: 2023-09-27 18:31:40

对不起,我是NHibernate的新手,我希望我不要因为这个问题而感到尴尬。

我有 2 个对象,一个日志和一个用户配置文件,分别在日志和用户配置文件表中。 每个日志对象引用一个或不引用用户配置文件对象。

我想要一种有效的方法来从 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中的等效物。 我想我不想为此延迟加载(这似乎是性能消耗),但我可能不清楚延迟加载是如何工作的。

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

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

没有类和映射很难回答。假设您在用户配置文件类中映射了与用户配置文件的日志对应的日志集合属性,则用户配置文件的类和映射应如下所示:

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

完全无法让 durn 的东西按照我想要的方式与标准一起工作,我作弊了:

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

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