Nhibernate QueryOver IList<;字符串>;财产

Nhibernate QueryOver IList<;字符串>;财产,nhibernate,queryover,Nhibernate,Queryover,我有一个映射类,它有一个ICollection属性,该属性映射为一个集合(使用按代码映射)。请注意,集合包含字符串,而不是另一个映射实体。e、 g public class Item { public virtual ICollection<string> Facts { get; set; } } public class ItemMapping { public ItemMapping() { Set(x => x.Facts,

我有一个映射类,它有一个ICollection属性,该属性映射为一个集合(使用按代码映射)。请注意,集合包含字符串,而不是另一个映射实体。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);
        }));
    }
}
公共类项目
{
公共虚拟ICollection事实{get;set;}
}
公共类项映射
{
公共项映射()
{
集合(x=>x.事实,m=>
{
m、 键(k=>k.Column(“ItemId”);
m、 表(“事实”);
},col=>col.Element(m=>
{
m、 列(“说明”);
m、 类型(NHibernateUtil.String);
}));
}
}
这是有效的,对具有事实的项执行CRUD操作也很有效


但是,我想查询数据库中的事实(例如,检索计数或前20个事实或检索一些随机事实),但如果没有实体,我该如何做?我不想引入事实实体,因为它唯一的属性是字符串。

非实体必须由其实体查询并选择。例如,要获得前20个事实:

string fact = null;
var first20facts = session.QueryOver<Item>()
    .JoinAlias(i => i.Facts, () => fact)
    .OrderBy(() => fact).Asc
    .Take(20)
    .Select(() => fact)
    .List<string>();
字符串事实=null;
var first20facts=session.QueryOver()
.JoinAlias(i=>i.Facts,()=>Facts)
.OrderBy(()=>事实).Asc
.Take(20)
.选择(()=>事实)
.List();

或者,您也可以映射一个只读实体作为事实查询。

我的建议是:

介绍实体。即使它只有一个财产。稍后您可以扩展它(使用顺序,IsVisible)。如果您在任何地方都这样做,您的框架将只从第一公民对象之间的
一对多
多对一
关系构建。这意味着简单的“框架泛化、重用…”

但是我看到你不喜欢它(请,至少试着重新思考一下)-所以有一种方法:

我试图证明(基于文档)我们可以使用神奇的单词
“.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>();
Item=null;
字符串事实=null;
var demos=session.QueryOver(()=>item)
.JoinAlias(i=>i.Facts,()=>Facts)
//而不是这个
//.Add(Restrictions.Eq(“事实”、“abc”))
//我们可以使用.elements关键字
其中(限制条件、等式(“事实要素”、“abc”))
.List();

因此,通过这种方式,你可以得到项目,这些项目的某些事实等于
“abc”

我接受了这个答案,因为这可能是最好的解决方法。我不想将其映射到实体的原因是,在我看来,它违反了YAGNI/KISS原则,即您可以稍后对其进行扩展等。因此,我最终将其映射,因为它确实为我提供了额外的QueryOver()灵活性/选项。即使是最简单的代码,我一生都无法复制此答案。我在其他地方读到过,旧版本的NHib(<4?)中可能存在别名错误。无论如何,我必须创建一个类来表示字符串项,然后可以毫无问题地进行查询。有点糟糕,但至少我有类型安全。