2010-04-07 41 views
-1

我有四个表:如何绘制词典<字符串,字符串>跨越几个表

CREATE TABLE [Languages] 
(
    [Id] INTEGER IDENTITY(1,1) NOT NULL, 
    [Code] NVARCHAR(10) NOT NULL, 
    PRIMARY KEY ([Id]), 
    UNIQUE INDEX ([Code]) 
); 

CREATE TABLE [Words] 
(
    [Id] INTEGER IDENTITY(1,1) NOT NULL, 
    PRIMARY KEY ([Id]) 
); 

CREATE TABLE [WordTranslations] 
(
    [Id] INTEGER IDENTITY(1,1) NOT NULL, 
    [Value] NVARCHAR(100) NOT NULL, 
    [Word] INTEGER NOT NULL, 
    [Language] INTEGER NOT NULL, 
    PRIMARY KEY ([Id]), 
    FOREIGN KEY ([Word]) REFERENCES [Words] ([Id]), 
    FOREIGN KEY ([Language]) REFERENCES [Languages] ([Id]) 
); 

CREATE TABLE [Categories] 
(
    [Id] INTEGER IDENTITY(1,1) NOT NULL, 
    [Word] INTEGER NOT NULL, 
    PRIMARY KEY ([Id]), 
    FOREIGN KEY ([Word]) REFERENCES [Words] ([Id]) 
); 

所以,你得到通过Word中的类别的名称 - > WordTranslation - >语言的关系。

像这样:

SELECT TOP 1 wt.Value 
FROM [Categories] AS c 
LEFT JOIN [WordTranslations] AS wt ON c.Word = wt.Word 
WHERE wt.Language = (
    SELECT TOP 1 l.Id 
    FROM [Languages] 
    WHERE l.[Code] = N'en-US' 
) 
AND c.Id = 1; 

,将返回类别的EN-美国翻译使用id = 1

我的问题是如何使用下面的类来映射这个:

public class Category 
{ 
    public virtual int Id { get; set; } 
    public virtual IDictionary<string, string> Translations { get; set; } 
} 

获得与上面的SQL查询相同的结果是:

Category category = session.Get<Category>(1); 

string name = category.Translations["en-US"]; 

而“名称”现在将包含en-US中的类别名称。

类别映射到类别表。

你会如何做到这一点,甚至有可能吗?

回答

1

如果你正在使用LINQ,你应该能够逃脱这样的:

public Category GetCategory(int categoryId) 
{ 
    var translations = from c in db.Categories 
         join wt in db.WordTranslations on c.Word equals wt.Word 
         join l in db.Languages on l.Id equals wt.Language 
         where c.Id == categoryId 
         select new { Key=l.Code, Value=wt.Word }; 
    return new Category { Id=categoryId, Translations=translations.ToDictionary() }; 
} 

我没有编译检查这个,所以你可能需要工作位的语法来得到正确的结果,但从概念上讲,它应该让你得到你需要的东西。

+0

严正?我真的不想这样做,我只是希望NH能够找出这些查询,并且马上使用字典。 – 2010-04-07 11:02:45

0

你看过使用SetResultTransformer。 NHibernate提供了将结果集映射到类或其他结构的函数。使用AliasToEntityMap的transfrom将每行转换为属性字典 - 这可能是您要查找的内容。

请参见this的第13.4节

+0

看起来很有希望,也许你可以举个例子吗? – 2010-04-07 11:03:19

相关问题