2010-03-06 64 views
1

我有一个现有的视图,其中有太多的数据。不幸的是我无法摆脱它,所以我需要尝试使用NHibernate映射解决它。这个想法是有NH发出以下查询:在映射中检索不同的值

SELECT DISTINCT User_Id, Module_Id, Application_Id, RightsMask 
FROM V_UserApplicationPermissions 
WHERE User_Id = ? 

我对的AccessControlEntry类型列表中当前映射看起来是这样的:

HasMany<AccessControlEntry>(x => x.Rights) 
    .WithTableName("V_UserApplicationPermissions") 
    .KeyColumnNames.Add("User_Id") 
    .Component(c => 
    { 
     c.Map(x => x.Module, "Module_Id"); 
     c.Map(x => x.Application, "App_Id"); 
     c.Map(x => x.Rights, "RightsMask").CustomTypeIs<ApplicationRightsType>(); 
    }) 
    .Not.LazyLoad(); 

如何有NHibernate的把DISTINCT关键字中的任何想法在查询期间有吗?

UPDATE:让我分享用户地图的其余部分,可以帮助,为什么它不是一个简单的标准:

WithTable("Users"); 
Id(x => x.Id, "UserId"); 
Map(x => x.Name, "UserName"); 
HasMany<long>(x => x.Clients) 
    .WithTableName("V_UserClients") 
    .KeyColumnNames.Add("UserId") 
    .AsElement("ClientId"); 

回答

1

奥利维尔Coanet从NHUsers邮件列表建议黑客成WithTableName工作:

HasMany<AccessControlEntry>(x => x.Rights) 
    .WithTableName("(SELECT DISTINCT User_Id, Module_Id, App_Id, RightsMask FROM V_UserApplicationPermissions)") 
    .KeyColumnNames.Add("User_Id") 
    .Component(c => 
    { 
     c.Map(x => x.Module, "Module_Id"); 
     c.Map(x => x.Application, "App_Id"); 
     c.Map(x => x.Rights, "RightsMask").CustomTypeIs<ApplicationRightsType>(); 
    })