【发布时间】:2015-09-15 11:57:46
【问题描述】:
我的想法是转换我之前定义的当前存储过程。目的是,我不能使用存储过程从数据库中返回数据。这样做的原因是留在查询中。我需要将现有表转换为数据透视表,之后我必须通过 ASP.NET WebAPI 返回数据。此数据透视表是动态的,这意味着当用户添加新文章时,它将作为列添加到数据透视表中。
普通表如下所示:
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 列对于数据透视表很重要,因为用户必须在角度视图中进行一些输入。在此示例中,用户选择dateFrom 和dateTo 输入。汇率将四舍五入您在数据透视列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);
}
我还在我的 WebAPI-Controller 中尝试了 .SqlQuery(),如下所示:
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;
}
但这并不是真正的正确回报。如果有人可以帮助我,那将非常有帮助!我会为每个好的答案投票!
【问题讨论】:
-
您永远无法将动态 PIVOT 语句的输出捕获到静态 EF 类型中。使用像 Dapper 这样的东西。
-
@GertArnold 你有什么例子可以看吗?如何用 LINQ 定义它?
-
@GertArnold 你知道如何用 Dapper Dot Net 实现上面的 pivot 例子吗?
-
@RoopeshShenoy 你对我的问题有什么想法吗?
标签: c# linq stored-procedures asp.net-web-api entity-framework-6