QueryOver IList <string>属性</string>

时间:2015-01-14 23:41:23

标签: nhibernate queryover

我有一个映射类,它有一个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实体,因为它唯一的属性是字符串。

2 个答案:

答案 0 :(得分:2)

好吧,我的建议是:

  

介绍实体。即使它只有一个属性。稍后你可以扩展它(使用Order,IsVisible)。如果你将在任何地方都这样做,你的框架将仅从第一个公民对象之间的one-to-manymany-to-one关系构建。这意味着简单的框架概括,重用...&#34;

但我发现你不喜欢(请,至少尝试重新思考) - 所以的方式

NHibernate How do I query against an IList property?

我试图展示(基于文档),我们可以使用神奇的单词 ".elements"

17.1.4.1. Alias and property references

所以查询将触及你案例中的字符串元素

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>();

另外,您也可以映射事实的只读实体,只是为了查询它。