我有一个映射类,它有一个ICollection属性,映射为一个Set(使用代码映射)。请注意,该集合包含字符串,而不是另一个映射实体。 e.g。
public class Item
{
public virtual ICollection<string> Facts { get; set; }
}
public class ItemMapping
{
public ItemMapping()
{
Set(x => x.Facts, m =>
{
m.Key(k => k.Column("ItemId"));
m.Table("Facts");
}, col => col.Element(m =>
{
m.Column("Description");
m.Type(NHibernateUtil.String);
}));
}
}
这项工作和有关事实的项目的CRUD操作正常。
但是,我想要QueryOver&lt;&gt;数据库中的事实(例如,检索计数或前20个事实或检索一些随机事实)但是如果没有实体,我该怎么做?我不想引入Fact实体,因为它唯一的属性是字符串。
答案 0 :(得分:2)
好吧,我的建议是:
介绍实体。即使它只有一个属性。稍后你可以扩展它(使用Order,IsVisible)。如果你将在任何地方都这样做,你的框架将仅从第一个公民对象之间的
one-to-many
和many-to-one
关系构建。这意味着简单的框架概括,重用...&#34;
但我发现你不喜欢(请,至少尝试重新思考) - 所以的方式:
我试图展示(基于文档),我们可以使用神奇的单词 ".elements"
:
所以查询将触及你案例中的字符串元素
Item item = null;
string fact = null;
var demos = session.QueryOver<Item>(() => item)
.JoinAlias(i => i.Facts, () => fact)
// instead of this
// .Add(Restrictions.Eq("fact", "abc"))
// we can use the .elements keyword
.Where(Restrictions.Eq("fact.elements", "abc"))
.List<Item>();
因此,通过这种方式,您可以获得项,其中的某些事实等于"abc"
答案 1 :(得分:1)
非实体必须由其实体查询并随后进行选择。例如,获取前20个事实:
string fact = null;
var first20facts = session.QueryOver<Item>()
.JoinAlias(i => i.Facts, () => fact)
.OrderBy(() => fact).Asc
.Take(20)
.Select(() => fact)
.List<string>();
另外,您也可以映射事实的只读实体,只是为了查询它。