如何解决NHibernate QueryOver <>问题返回子实体的父集合
|| 我有一个父实体Category_Types,其中包含一个子实体Categories,这些子实体中的每个子实体都有一个子实体集合。费用: Category_Types >>类别(1:n),类别>>费用(1:n) 我想查询特定日期之间特定Category_Type的总费用 进入以下未映射的类public class EntityTotals<T>
{
T _Entity;
public T Entity
{
get
{
return _Entity;
}
set
{
_Entity = value;
}
}
decimal _Total;
public decimal Total
{
get
{
return _Total;
}
set
{
_Total = value;
}
}
}
我有以下SQL查询:
select ct.Cat_Type,SUM(isnull(e.Spends,0)) from Expenses e right join Categories c on e.Category_Id = c.Category_Id
right join Category_Types ct on ct.Cat_Type_Id = c.Cat_Type_Id
where e.Spend_Date between @from and @to
group by ct.Cat_Type
所以我使用QueryOver <>编写了一个查询,以获取与SQL查询相同的结果
我将结果输入EntityTotals <>类,如下所示:
Expenses e = null;
Categories c = null;
Category_Types ct = null;
return Session.QueryOver<Expenses>((() => e))
.JoinAlias(() => e.Category,() => c)
.JoinAlias(() => c.Category_Type,() => ct)
.WhereRestrictionOn(() => e.Spend_Date)
.IsBetween(from)
.And(to)
.SelectList(list => list
.SelectGroup(() => ct)
.SelectSum(ee => ee.Spends))
.List<object[]>()
.Select(exp =>
new EntityTotals<Categories>()
{
Entity = (Categories)exp[0],Total = (decimal)exp[1]
})
.ToList<EntityTotals<Categories>>();
当我测试此查询时,它给了我以下异常:
无法解析属性:ct的:费用
所以我试图只将Category_Types的一些属性添加到以下未映射的类中
public class Totals
{
int _Id;
public int Id
{
get
{
return _Id;
}
set
{
_Id = value;
}
}
decimal _Total;
public decimal Total
{
get
{
return _Total;
}
set
{
_Total = value;
}
}
}
使用以下查询仅获得Category_Types的属性Cat_Type_Id,它可以正常工作:
Expenses e = null;
Categories c = null;
Category_Types ct = null;
return Session.QueryOver<Expenses>((() => e))
.JoinAlias(() => e.Category,() => c)
.JoinAlias(() => c.Category_Type,() => ct)
.WhereRestrictionOn(() => e.Spend_Date)
.IsBetween(from)
.And(to)
.SelectList(list => list
.SelectGroup(() => ct.Cat_Type_Id)
.SelectSum(ee => ee.Spends))
.List<object[]>()
.Select(exp =>
new Totals()
{
Id = (int)exp[0],Total = (decimal)exp[1]
})
.ToList<Totals>();
那么如何从第一个查询中获取Category_Types的完整对象?
谢谢 ;
解决方法
根据您实际要返回的内容,以下解决方案之一将起作用:
1)如果您想退还
EntityTotals<Categories>
,请执行以下操作:
.SelectList(list => list
.SelectGroup(() => e.Category)
.SelectSum(ee => ee.Spends))
.List<object[]>()
.Select(exp =>
new EntityTotals<Categories>()
{
Entity = (Categories)exp[0],Total = (decimal)exp[1]
})
.ToList<EntityTotals<Categories>>();
2)如果您想退还EntityTotals<Category_Types>
,请执行以下操作:
.SelectList(list => list
.SelectGroup(() => c.Category_Type)
.SelectSum(ee => ee.Spends))
.List<object[]>()
.Select(exp =>
new EntityTotals<Category_Types>()
{
Entity = (Category_Types)exp[0],Total = (decimal)exp[1]
})
.ToList<EntityTotals<Category_Types>>();
您不能做.SelectGroup(() => ct)
,因为ct
根本不是任何东西的财产。这就是异常的意思。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。