如何让NHibernate映射到元组或类?

时间:2017-10-20 10:22:04

标签: c# nhibernate

我有以下方法从数据库中获取结果列表。

public static IList<T> Find<T>(DetachedCriteria crit) where T : class
{
    lock (_locker)
    {
        return crit.GetExecutableCriteria(InstanceSession)
            .List<T>();
    }
}

这通常很有效。但是,我已经更改了一个调用上述方法的方法。

public IList<FooBarResult> FindResults(FooBarTask st)
{
    return DataAccess.Find<FooBarResult>(DetachedCriteria.For<FooBarResult>()
        .Add(Restrictions.Eq("Task", st))).ToList();
}

对此有用(因为我不想返回整个FooBarResult,只有某些列)。

public IList<Tuple<DateTime, Guid>> FindResults(FooBarTask st)
{
    return DataAccess.Find<Tuple<DateTime, Guid>>(DetachedCriteria.For<FooBarResult>()
        .Add(Restrictions.Eq("Task", st))
        .SetProjection(
            Projections.ProjectionList()
                .Add(
                    Projections.Property("FieldOne")
                )
                .Add(
                    Projections.Property("FieldTwo")
                )
        )
    )
    .ToList();
}

我希望顶部的Find方法会自动将列表的条目转换为Tuple,但它只返回System.Object[]

有什么办法可以让它返回一个元组列表吗?

1 个答案:

答案 0 :(得分:3)

您可以尝试使用this answer中所述的SetResultTransformer

var tupleConstructor = typeof(Tuple<DateTime, Guid>).GetConstructors()[0];

然后:

 return DataAccess.Find<Tuple<DateTime, Guid>>(DetachedCriteria.For<FooBarResult>()
    .Add(Restrictions.Eq("Task", st))
    .SetProjection(
        Projections.ProjectionList()
            .Add(
                Projections.Property("FieldOne")
            )
            .Add(
                Projections.Property("FieldTwo")
            )
    ).SetResultTransformer(Transformers.AliasToBeanConstructor(tupleConstructor))
).ToList();