[英]Why are my values of my first query, being returned as values from my second query?
一些背景。 我们创建了一个名为SqlSum的类型。 它具有2个属性,Id和SumValue。
我在同一会话中有两个查询:
SqlSum paidTemp = session.CreateSQLQuery(
"select count(p.id) as Id, Sum(p.PaymentAmount) as SumValue " +
"FROM StPayments p " +
"where p.Active = 1 and p.IsVoided = 0 and p.StCustomerFk = :custid")
.AddEntity(typeof(SqlSum))
.SetParameter("custid", cust.Id)
.List<SqlSum>().First();
if (paidTemp != null)
{
paid = paidTemp.SumValue;
}
SqlSum allocTemp = session.CreateSQLQuery(
"select count(pA.id) as Id, Sum(pA.Amount) As SumValue " +
"FROM StPaymentAllocations pA " +
"INNER JOIN StPayments p on pA.StPaymentFk = p.Id " +
"where pA.Active = 1 and p.StCustomerFk = :custid")
.AddEntity(typeof(SqlSum))
.SetParameter("custid", cust.Id)
.List<SqlSum>().First();
if (allocTemp != null)
{
allocated = allocTemp.SumValue;
}
我可以在探查器中清楚地看到,针对paytemp的查询返回的总和为1575,而allocTemp查询的返回值为1500,但是,已支付和已分配变量均被分配为1575。实际上,对allocTemp的检查调试器中的.SumValue属性显示值为1575。
现在,我做了一些细微的更改,并将每个查询移至各自的会话中:
using (var session = factory.OpenSession())
using (var trans = session.BeginTransaction(IsolationLevel.ReadCommitted))
{
SqlSum paidTemp = session.CreateSQLQuery(
"select count(p.id) as Id, Sum(p.PaymentAmount) as SumValue " +
"FROM StPayments p " +
"where p.Active = 1 and p.IsVoided = 0 and p.StCustomerFk = :custid")
.AddEntity(typeof(SqlSum))
.SetParameter("custid", cust.Id)
.List<SqlSum>().First();
if (paidTemp != null)
{
paid = paidTemp.SumValue;
}
trans.Commit();
session.Flush();
}
using (var session = factory.OpenSession())
using (var trans = session.BeginTransaction(IsolationLevel.ReadCommitted))
{
SqlSum allocTemp = session.CreateSQLQuery(
"select count(pA.id) as Id, Sum(pA.Amount) As SumValue " +
"FROM StPaymentAllocations pA " +
"INNER JOIN StPayments p on pA.StPaymentFk = p.Id " +
"where pA.Active = 1 and p.StCustomerFk = :custid")
.AddEntity(typeof(SqlSum))
.SetParameter("custid", cust.Id)
.List<SqlSum>().First();
if (allocTemp != null)
{
allocated = allocTemp.SumValue;
}
trans.Commit();
session.Flush();
}
执行此代码后,突然alloctemp.SumValue为1500。
是什么导致第二个查询保留第一个示例中第一个查询的值?
如果您的Id
列值可以返回相同的值,则一级缓存已经认为该ID在其中,并且将duplicate
行。
因此:-
Id
保留为一列,则请转换为dto
记住要重写Equals
和GetHashCode
。 例如看这个例子 Id
(老实说,我不确定这一点)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.