Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从NHibernate中的相关表中选择一组不同的值_C#_Nhibernate_Nhibernate Criteria - Fatal编程技术网

C# 从NHibernate中的相关表中选择一组不同的值

C# 从NHibernate中的相关表中选择一组不同的值,c#,nhibernate,nhibernate-criteria,C#,Nhibernate,Nhibernate Criteria,对不起,我是NHibernate的新手,我希望我不要因为这个问题而让自己难堪 我在Logs和UserProfiles表中分别有两个对象,一个Log和一个UserProfile。每个日志对象引用一个或不引用UserProfile对象 我想要一种有效的方法,从Logs表中收集UserProfile.UserName字符串的不同列表,按字母顺序排列。对于Linq,这相当简单,但我希望在数据库端完成这项工作。我会怎么做 public IEnumerable<string> GetUserNa

对不起,我是NHibernate的新手,我希望我不要因为这个问题而让自己难堪

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

我想要一种有效的方法,从Logs表中收集
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>();