2010-04-07 44 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

相關問題