对不起我是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中的等价物。我想我不希望延迟加载(这似乎是性能消耗)但我可能不清楚延迟加载是如何工作的。
答案 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>();
这给了我正在寻找的结果。感谢那些帮助过的人。