更新.如何访问本地SQL NHibernate查询返回的值

本文关键字:NHibernate SQL 查询 返回 何访问 访问 更新 | 更新日期: 2023-09-27 17:51:09

我有这样一个表(表名是price):

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

我想要获得每个商店在最近日期中为单个产品输入次数最多的值。注意,I要将时间戳转换为日期。

现在我有这个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));
            }

据我所知,addscalar定义了sql语句返回数据的输出属性,但我无法访问列表中的任何变量。

怎么了?应该以不同的方式处理吗?

更新.如何访问本地SQL NHibernate查询返回的值

这是记录在NHibernate参考,标量查询:

这将返回一个带有标量的对象数组(Object[])的列表(CATS)表中每列的值

的例子:

var result = _session.CreateSQLQuery("...")
                     .AddScalar(...).AddScalar(...)
                     .List();
var row0property0 = ((object[])result[0])[0];
var row0property1 = ((object[])result[0])[1];

我认为你也可以做...List<object[]>,以避免在访问属性值时必须转换为object[]

原始SQL查询在NHibernate中最大的用途是当你告诉NHibernate根据返回的数据实际构建实体实例时。