我有四张桌子:
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;
这将返回Id = 1的类别的en-US翻译。
我的问题是如何使用以下类来映射它:
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"];
“name”现在将包含en-US中的类别名称。
根据“类别”表格映射类别。
你会怎么做呢,甚至可能吗?
答案 0 :(得分: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() };
}
我没有编译检查这个,所以你可能需要使用语法来获得正确的结果,但从概念上讲它应该能得到你所需要的。
答案 1 :(得分:0)
您是否考虑过使用 SetResultTransformer 。 NHibernate提供此函数用于将结果集映射到类或其他结构。使用AliasToEntityMap的transfrom将每行转换为属性字典 - 这可能是您要查找的内容。
见this
的第13.4节