2017-03-06 2 views
1

CRUD를 위해 설정 한 DB에서 테이블을 주입했습니다..NET에서 DB보기

ID EID  Task   entrydate Level 
1 1 Demographics 2017-02-23 2 
2 0 Demographics 2017-02-23 2 
3 1 Progress Notes 2017-03-06 2 
4 1 Demographics 2017-03-06 3 
5 1 Assessments  2017-03-06 3 
6 1 Assessments  2017-01-25 1 

그러나 클라이언트에게 의미가있는 방식으로 데이터를 표시하려면 entrydate별로 열에 레벨 데이터를 나열해야합니다.

ID EId  Task   25 Jan 2017 23 Feb 2017 06 Mar 2017 
1 1 Demographics  NULL   2   NULL 
2 0 Demographics  NULL   2   NULL 
3 1 Progress Notes  NULL   NULL   2 
4 1 Demographics  NULL   NULL   3 
5 1 Assessments   NULL   NULL   3 
6 1 Assessments   1   NULL   NULL 

저는 컨트롤러와보기 모두에서 LINQ를 사용하여보기에 올바른 테이블을 만들려고 노력했습니다.

컨트롤러 :

public IActionResult Index(int id) 
    { 
     HttpContext.Session.SetInt32("EmployeeID", id); 
     var model = db.EmployeeTask 
      .Where(h => h.EmployeeId == id) 
      .OrderByDescending(h => h.Entrydate); 

     return View(model); 
    } 

보기 페이지 : 내 결과에

<table class="table"> 
<thead> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.KeyTask) 
     </th> 
@foreach (var group in Model.GroupBy(item => item.Entrydate)) 
{ 
     <th> 
      @group.Key.Date 
     </th> 
} 
     <th></th> 
    </tr> 
</thead> 
<tbody> 
@foreach (var group in Model.GroupBy(item => item.KeyTask)) { 
    <tr> 
     <td> 
      @group.Key 
     </td> 
     @foreach (var item in group) 
     { 
      <td> 
       @Html.DisplayFor(modelItem => item.Acceptable) 
      </td> 

     } 
    </tr> 
} 
</tbody> 
</table> 

, 내가 거의 다입니다. 내가 수용의 데이터로 뭔가를 놓친 거지

View from MVC

는 entrydate 컬럼과 일치하지 않습니다. 나는 올바른 길을 가고 있습니까? 아니면 LINQ가 나를 데리고 다른 접근법을 시도 할 때까지 갔습니까?

+0

열과 본문에 대한 귀하의 그룹이 다릅니다 - 동일한 그룹에서 결과를 보지 못하고 있음을 의미합니다. EntryDate에 의한 결과 – Jaya

+0

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

답변

0

많은 검색, 읽기, 시행 착오를 거쳐이 작업을 할 수있는 방법을 찾았습니다.

첫 번째로, 나는 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 연결을 추가! 누구나 쉬운 방법이 있다면 나는 그것을 밖으로 시도 할 수 있습니다

enter image description here

는 대답으로 게시하시기 바랍니다, 그러나 이것은 .NET 코어 1.1에서 잘 작동합니다.