我有以下方法从数据库中获取结果列表。
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[]
。
有什么办法可以让它返回一个元组列表吗?
答案 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();