我有这个表(表名是价格):
value productId ShopID Timestamp
1.30 1 5 2015-05-30 05:20:28.000
1.20 1 5 2015-05-29 16:09:34.000
1.00 1 5 2015-05-29 16:09:43.000
1.20 1 5 2015-05-29 16:09:50.000
1.20 1 5 2015-05-29 16:09:58.000
1.00 2 5 2015-05-29 16:10:13.000
1.00 2 5 2015-05-29 16:10:17.000
1.00 1 6 2015-05-29 16:10:42.000
1.00 1 5 2015-05-30 15:02:44.000
1.30 1 5 2015-05-30 15:03:24.000
我希望获得在单个产品的每个商店的最新日期输入的价值。请注意,我想将时间戳转换为日期。
现在我有这个SQL查询:
select count(*), value, Productid, shopid
from price
where shopid = 5
and productId = 1
and cast(floor(cast(Timestamp as float)) as datetime)
in (select max(cast(floor(cast(Timestamp as float)) as datetime)) as [date] from price)
group by value, Productid, shopid
order by count(*) desc
它返回单品和单店的订购数量,如下所示:
Count value Productid shopid
2 1.30 1 5
1 1.00 1 5
在理想的情况下,我想只获得最大数量的行,但我想这也可以。
到目前为止,我一直在我的解决方案中使用QueryOver查询,但我想可以在c#中使用的任何内容都可以。
TIA
更新
在评论中提出建议我尝试使用本机SQL。我已经获得了这个代码来获得不同的商店ID,这很好用。
var shopIds =
_session.CreateSQLQuery("select distinct shopid from price where productid = " + productId).List();
然后我试图为每个商店执行主要查询,之后我想找到这样一个最频繁价格的单个实例:
List<Price> query;
foreach (var shopId in shopIds)
{
var querySubResult = _session.CreateSQLQuery("select value, productId, shopId" +
"from price " +
"where shopid = " + shopId +
"and productId = " + productId +
"and cast(floor(cast(Timestamp as float)) as datetime) " +
"in (select max(cast(floor(cast(Timestamp as float)) as datetime)) as [date] from price)" +
"group by value, Productid, shopid" +
"order by count(*) desc")
.AddScalar("value", NHibernateUtil.Decimal)
.AddScalar("productId", NHibernateUtil.Int64)
.AddScalar("shopId", NHibernateUtil.Int64).List();
query.Add(_session.QueryOver<Price>()
.Where(x => x.Value == querySubResult[1].value)
.And(x => x.Product.ProductId == querySubResult[1].productId)
.And(x => x.Shop.ShopId == querySubResult[1].shopId));
}
据我所知,AddScallar定义了sql语句中返回数据的输出属性,但是我无法访问列表中的任何变量。
有什么问题?它应该以不同的方式被接受吗?任何帮助都会受到欢迎。
答案 0 :(得分:0)
NHibernate Reference, Scalar Queries中记录了这一点:
这将返回带有标量的Object数组(object [])的IList (CATS)表中每列的值。
示例:
var result = _session.CreateSQLQuery("...")
.AddScalar(...).AddScalar(...)
.List();
var row0property0 = ((object[])result[0])[0];
var row0property1 = ((object[])result[0])[1];
我认为您也可以执行...List<object[]>
以避免在访问属性值时转换为object[]
。
NHibernate中原始SQL查询的最大用处是告诉NHibernate从返回的数据中实际构建实体实例。