【问题标题】:Update. How to access values returned by native SQL NHibernate query?更新。如何访问本机 SQL NHibernate 查询返回的值?
【发布时间】:2015-05-30 12:33:36
【问题描述】:

我有这张表(表名是价格):

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

更新

按照 cmets 中的建议,我正在尝试使用本机 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 语句返回的数据定义了输出属性,但我无法访问列表中的任何变量。

怎么了?是否应该以不同的方式接近它?任何帮助将不胜感激。

【问题讨论】:

  • C# 还有其他方法可以在不使用 Hibernate 的情况下向 SQL Server 发送查询,例如使用 SqlConnection。
  • 我已经在我的解决方案中使用了 NHibernate,我想坚持下去,因为它已经配置好并且可以工作了,但是感谢您的建议。
  • 除非它需要与数据库无关,否则您可以参数化现有查询并使用 CreateSQLQuery。
  • @user3677314 。 . .如果您正在运行本机 SQL 查询,我建议您使用本机接口,除非您有充分的设计理由使用 Hibernate。转换听起来很麻烦,但有一个简单的解决方法。
  • 谢谢你们。我正在尝试使用本机 SQL,但遇到了一些问题。请查看他们的更新帖子,也许您知道解决方案。

标签: c# sql nhibernate queryover


【解决方案1】:

这记录在NHibernate Reference, Scalar Queries:

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

例子:

var result = _session.CreateSQLQuery("...")
                     .AddScalar(...).AddScalar(...)
                     .List();

var row0property0 = ((object[])result[0])[0];
var row0property1 = ((object[])result[0])[1];

我认为您也可以使用...List&lt;object[]&gt; 来避免在访问属性值时强制转换为object[]

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

【讨论】:

  • 如果我将 querySubResult[1].value 转换为 querySubResult[1][0],我会在 querySubResult[1][0] 中的“[0]”下得到红色波浪线。为什么会这样?
  • 我不知道 - Visual Studio/编译器告诉你什么错误?
  • 视觉工作室展示。无法从 'NHibernate.IQueryOver' 转换为 'WebApiPrice.Data.Entities.Price'
  • 无法将 lambda 表达式转换为类型“NHibernate.Criterion.ICriterion”,因为它不是委托类型
  • Delegate 'System.Func' 不接受 1 个参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多