将存储过程数据透视表转换为LINQ查询

本文关键字:LINQ 查询 转换 存储 过程数据 透视 | 更新日期: 2023-09-27 18:12:44

我的想法是将当前存储过程转换为我之前定义的存储过程。这样做的目的是,我不能使用存储过程从数据库返回数据。此目的的原因在查询中留下。我需要将现有的表转换为数据透视表,之后我必须通过ASP返回数据。净之前。这个数据透视表是动态的,这意味着当用户添加一篇新文章时,它将作为一列添加到数据透视表中。

正常的表如下所示:

datum      | rate     | article
--------------------------------
2013-01-03 |  97,766..|  DE011
2013-01-05 |  90.214..|  DE090
2013-01-10 |  97,890..|  DE011
2013-01-13 |  65,023..|  DE220
2013-01-13 |  97,012..|  DE300
2013-01-15 |  97,344..|  DE300
....

数据透视表应该如下所示:

rate | DE011 | ... | DE090 | ... | DE220 | ... | DE300
-------------------------------------------------------
100  |   0   | ... |   1   | ... |   0   | ... |   0
 98  |   2   | ... |   0   | ... |   1   | ... |   0
 97  |   0   | ... |   0   | ... |   0   | ... |   2
 90  |   0   | ... |   1   | ... |   0   | ... |   4
...

datum对于透视表很重要,因为用户必须在角度视图中进行一些输入。在这个例子中,用户选择了dateFromdateTo输入。该比率将四舍五入您可以在透视列rate中看到的数字。文章描述位于新表的列标题中,并且该比率将计算每篇文章。

我的存储过程在SQL Server中工作正常。但是在SP被导入到EDM模型之后,实体框架定义了一个返回类型INT,这对于我的目的来说是不可能的。

下面是EF的代码:
 public virtual int getMonthIsin(Nullable<System.DateTime> fromDate, Nullable<System.DateTime> toDate)
        {
            var fromDateParameter = fromDate.HasValue ?
                new ObjectParameter("fromDate", fromDate) :
                new ObjectParameter("fromDate", typeof(System.DateTime));
            var toDateParameter = toDate.HasValue ?
                new ObjectParameter("toDate", toDate) :
                new ObjectParameter("toDate", typeof(System.DateTime));
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("getMonthIsin", fromDateParameter, toDateParameter);
        }

我也尝试了。sqlquery()在我的WebAPI-Controller如下:

return db.Database.SqlQuery<IQueryable>("EXEC getMonthIsin @fromDate, @toDate", fromDate, toDate).AsQueryable();

但是行不通。

好,现在的想法是尝试LINQ查询并获得返回值。我没有任何想法来实现这个:(

目前我已经尝试了大约这个LINQ查询:

public IQueryable getDatas(DateTime fromDate, DateTime toDate)
{
   var query = from t in db.table1
               where t.datum >= fromDate && t.datum <= toDate
               group t by t.article
                 into grp
                 select new
                 {
                    articles = grp.Key,
                    rate = grp.Select(g => g.rate),
                    total = grp.Select(g => g.rate).AsQueryable()
                 };
   return query;
}

但这不是真正正确的返回。如果有人能帮助我,那就太有帮助了!!我会为每一个好的答案投票!

将存储过程数据透视表转换为LINQ查询

实体框架不适合获取动态数据结构。Dapper是这里要使用的工具。它基本上是IDbConnection上的扩展方法的集合,其中一个是Query,它返回IEnumerable<dynamic>,其中dynamic是实现IDictionary<string, object>的对象。获取数据非常简单:

IEnumerable<IDictionary<string, object>> result;
using (var cnn = new SqlConnection(connectionString))
{
    cnn.Open();
    var p = new DynamicParameters();
    p.Add(" @fromDate", fromDate, DbType.DateTime);
    p.Add(" @toDate", toDate, DbType.DateTime);
    result = (IEnumerable<IDictionary<string, object>>)
                cnn.Query(sql: "getMonthIsin", 
                          param: p, 
                          commandType: CommandType.StoredProcedure);
}

现在您有了一个IEnumerable<IDictionary<string, object>>,其中一项(IDictionary<string, object>)表示存储过程结果集中的一行键/值对:

Key    Value
-----  ----
rate   100
DE011  0
...    ...
DE090  1
...    ...
DE220  0
...    ...
DE300  0

如何从这里开始由你决定。例如,您可以将结果转换为DataTable,如下所示:DataTable。

顺便说一下,Dapper不仅简单,而且速度也非常快。