C# 从NHibernate中的相关表中选择一组不同的值
对不起,我是NHibernate的新手,我希望我不要因为这个问题而让自己难堪 我在Logs和UserProfiles表中分别有两个对象,一个Log和一个UserProfile。每个日志对象引用一个或不引用UserProfile对象 我想要一种有效的方法,从Logs表中收集C# 从NHibernate中的相关表中选择一组不同的值,c#,nhibernate,nhibernate-criteria,C#,Nhibernate,Nhibernate Criteria,对不起,我是NHibernate的新手,我希望我不要因为这个问题而让自己难堪 我在Logs和UserProfiles表中分别有两个对象,一个Log和一个UserProfile。每个日志对象引用一个或不引用UserProfile对象 我想要一种有效的方法,从Logs表中收集UserProfile.UserName字符串的不同列表,按字母顺序排列。对于Linq,这相当简单,但我希望在数据库端完成这项工作。我会怎么做 public IEnumerable<string> GetUserNa
UserProfile.UserName
字符串的不同列表,按字母顺序排列。对于Linq,这相当简单,但我希望在数据库端完成这项工作。我会怎么做
public IEnumerable<string> GetUserNamesInLogs(){}
我正在寻找NHibernate中的等效项。我认为我不希望为此进行延迟加载(这似乎是一种性能消耗),但我可能不清楚延迟加载是如何工作的。如果没有类和映射,很难回答。 假设在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>
............
公共类用户配置文件
{
...
公共虚拟IList日志{get;set;}
...
}
.....
............
,您可以尝试以下方法:
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();
UserProfile upAlias=null;
var result=yourNHSession.QueryOver(()=>upAlias)
.JoinQueryOver(x=>x.Logs)
.选择(
投影,清晰(
投影。投影列表()
.Add(projects.Property(x=>x.Name)))
.OrderBy(()=>upAlias.Name)
.Asc
.List().ToList();
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>();
UserProfile userProfileAlias=null;
Log logAlias=null;
session.QueryOver(()=>userProfileAlias)
.JoinAlias(()=>userProfileAlias.Logs,()=>logAlias)
.选择(
Projections.Distinct(Projections.Property(()=>userProfileAlias.Name)))
.OrderBy(()=>userProfileAlias.Name).Asc
.List();
完全没有按照我希望的方式使用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>();
var result=\u Session.CreateQuery(“从日志中选择distinct profile.UserName作为l internal join l.UserProfile作为profile order by profile.UserName asc”)
.List();
这给了我想要的结果。感谢那些帮助过你的人。你是说你想加载日志,然后为每个日志加载一个不同用户名的集合,还是说你只需要一个包含所有不同用户名的查询?这个问题不太清楚,因为我想要一个出现在我的日志条目中的用户名的独特列表。我想我不会想要那个懒洋洋的,但我可能错了。我将为我的问题添加更多的上下文。嗯。。。实际上,我将一个
UserProfile
类映射到我的日志类。这有区别吗?哇,这看起来很复杂。@JeremyHolovacs:编辑了我的帖子,希望这能有所帮助。当添加投影/不同的过度投影/排序过度投影时,它很快就会变得复杂;-)也许有一个更简单的解决方案。我不明白,为什么要创建别名“upAlias”并使用instant of it lambda“x”。@Anton,我找不到正确的语法来将别名包含在投影中(需要删除)。谢谢你的提示,很抱歉回复晚了。
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>();