2012-04-20 86 views
1

對不起,我是NHibernate的新手,我希望我不會爲這個問題感到難堪。從NHibernate的相關表中選擇不同的值集合

我在Logs和UserProfiles表中分別有2個對象,一個Log和一個UserProfile。每個Log對象引用一個或者沒有UserProfile對象。

我想要一個有效的方式從日誌表中收集一個不同的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

你是說你想加載日誌,然後延遲加載每個日誌的不同用戶名的集合,或者你只是想要一個具有所有不同用戶名的查詢?這個問題還不夠清楚 – Rippo 2012-04-20 10:02:27

+0

我想要一個獨特的用戶名列表,這些用戶名出現在我的日誌條目中。我會認爲我不想要那些懶惰的,但我可能是錯的。我將爲我的問題添加更多的上下文。 – 2012-04-20 11:17:17

回答

0

完全未能獲得杜蘭東西的工作,我想它用標準的方式,我被騙了:

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

這給了我,我一直在尋找的結果。感謝幫助過的人們。

1

沒有類和映射很難回答。 假設你在用戶配置類映射對應於用戶配置的日誌一日誌集合屬性,類和映射爲用戶配置應該是這樣的:

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> 

............ 

,你可以嘗試這樣的事:

​​
+0

嗯......實際上我把一個'UserProfile'類映射到我的Log類。這有什麼區別嗎?哇,那看起來很複雜。 – 2012-04-20 13:01:53

+0

@JeremyHolovacs:編輯我的帖子,希望這會有所幫助。當添加投影/區別投影/排序投影時,它很快變得複雜;-)也許有一個更簡單的解決方案。 – jbl 2012-04-20 13:47:02

+0

今晚我會試試這個。 – 2012-04-20 13:49:50

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>(); 
相關問題