如何映射字典<string,string =“”>跨越几个表</string,>

时间:2010-04-07 09:34:33

标签: c# nhibernate dictionary

我有四张桌子:

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获得了一个类别的名称 - &gt; WordTranslation - &gt;语言关系。

像这样:

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中的类别名称。

根据“类别”表格映射类别。

你会怎么做呢,甚至可能吗?

2 个答案:

答案 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节