많은 검색, 읽기, 시행 착오를 거쳐이 작업을 할 수있는 방법을 찾았습니다.
첫 번째로, 나는 LINQ 표현이 내가 갈 필요가있는 방식이 아니라는 것을 깨달았다. 개별적으로 행을 작성해야했습니다. 데이터에 동적 열이 있으므로 DBSet이 작동하지 않습니다. 그래서 SQL에서 Pivot 쿼리를 만들었습니다.
DECLARE @cols NVARCHAR (MAX),
@StartDate date = '03/01/2017',
@EndDate date = '03/20/2017',
@Id nvarchar(10) = 1
SELECT @cols = COALESCE (@cols + ',[' + CONVERT(NVARCHAR, entrydate, 106) +
']',
'[' + CONVERT(NVARCHAR, entrydate, 106) + ']')
FROM (SELECT DISTINCT entrydate
FROM EmployeeTask
WHERE entrydate >= @StartDate AND entrydate <= @EndDate
AND EmployeeId = @Id) PV
ORDER BY entrydate DESC
DECLARE @query NVARCHAR(MAX)
SET @query = '
SELECT * FROM (SELECT KeyTask, acceptable, entrydate
FROM EmployeeTask
WHERE EmployeeId = ('+ @Id +')
Group by KeyTask, acceptable, entrydate) x
PIVOT (SUM(acceptable) FOR entrydate IN (' + @cols + ')) p
'
EXEC SP_EXECUTESQL @query
저에게 표시하려는 테이블을 제공하지만 MVC 6에 표시하는 방법은 무엇입니까?
먼저, this SO post을 찾았습니다. Petr Vobornik의 답은 제가 필요한 것입니다. 나는 그것을 수정했고 내 컨트롤러에 추가 : 문 목록이 아직 생성되도록 빈 행을 추가하는 데 사용되는 경우
private static List<Dictionary<string, object>> LoadData(string sqlSelect,
params object[] sqlParameters)
{
var table = new List<Dictionary<string, object>>();
using (var ctx = new DBContext())
{
ctx.Database.GetDbConnection();
ctx.Database.OpenConnection();
using (var cmd = ctx.Database.GetDbConnection().CreateCommand())
{
cmd.CommandText = sqlSelect;
foreach (var param in sqlParameters)
cmd.Parameters.Add(param);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var row = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
row[reader.GetName(i)] = reader[i];
table.Add(row);
}
if (table == null)
{
var row = new Dictionary<string, object>();
for (int i = 0; i < 1; i++)
row[reader.GetName(i)] = "None";
table.Add(row);
}
}
}
}
return table;
}
제 1,하지만 아무것도 포함하지 않는다. 이렇게하면 쿼리에서 아무것도 반환하지 않으면 빈 뷰를로드 할 수 있습니다 (아래보기 참조).
@model List<Dictionary<string, object>>
@{
ViewData["Title"] = "Employee Tasks";
}
<h2>Employee Tasks</h2>
<div class="panel panel-default">
<div class="panel-heading">Search by dates</div>
<div class="panel-body">
<form asp-controller="EmployeeTasks" asp-action="Index">
<label>Start Date</label>
<input type="date" name="datestart" id="start" [email protected]
/>
<label>End Date</label>
<input type="date" name="dateend" id="end" [email protected] />
<input type="submit" value="Search" />
</form>
</div>
</div>
<p>
<a asp-action="Create">Add New Employee Task</a>
</p>
@if (Model.FirstOrDefault() != null)
{
<table class="table table-bordered">
@foreach (var row in Model.FirstOrDefault())
{
<th>@row.Key</th>
}
@foreach (var row in Model)
{
<tr>
@foreach (var column in row)
{
<td>@column.Value</td>
}
</tr>
}
</table>
}
<div>
<a asp-controller="Employees" asp-action="Index">Back to Employee
Search</a>
</div>
그리고 최종 결과 :
public IActionResult Index(int id, string datestart, string dateend)
{
HttpContext.Session.SetInt32("EmployeeID", id);
if(datestart == null)
{
var setdate = DateTime.Now;
datestart = setdate.AddMonths(-3).ToString();
}
if(dateend == null)
{
dateend = DateTime.Now.ToString();
}
var start = new SqlParameter("@StartDate", datestart);
var end = new SqlParameter("@EndDate", dateend);
var EmpId = new SqlParameter("@Id", id);
var tasks = LoadData("EXECUTE dbo.TaskView @StartDate, @EndDate,
@Id",start,end,EmpId);
ViewBag.start = DateTime.Parse(datestart);
ViewBag.end = DateTime.Parse(dateend);
return View(tasks);
}
다음, 내가보기 수정 :
나는 내 컨트롤러에서 SQL 연결을 추가! 누구나 쉬운 방법이 있다면 나는 그것을 밖으로 시도 할 수 있습니다

는 대답으로 게시하시기 바랍니다, 그러나 이것은 .NET 코어 1.1에서 잘 작동합니다.
열과 본문에 대한 귀하의 그룹이 다릅니다 - 동일한 그룹에서 결과를 보지 못하고 있음을 의미합니다. EntryDate에 의한 결과 – Jaya
@JS_GodBlessAll : 숫자는 행의 날짜에 줄을 긋지 만, 행이 작업이어야합니다. 여기서 가장 큰 문제는 일부 날짜에 동의하지 않는 작업의 자리 표시 자 역할을 할 실제 null 또는 0이 없다는 것입니다. 하나씩 행을 만들려고했지만 날짜 열이 동적이기 때문에 캡처해야하는 것을 정확하게 반영하는 모델을 만들 수 없습니다. 나는 또한 [여기] (http://stackoverflow.com/questions/34390090/whats-the-alternative-to-datatable-with-ado-net-under-mvc-6)에서 발견 된 SQL 메소드를 사용해 보았습니다. 하지만 아직 제대로 작동하지 않는 것 같습니다. –