2017-08-05 67 views
-2

我有一個具有以下結構的數據。我正在使用實體框架。從實體框架中的列數據顯示列名稱

Id  fileName date     status 
--------------------------------------------- 
1  file1  12-05-2016 11:30  fail 
2  file1  12-05-2016 11:35  success 
3  file2  13-05-2016 12:01  success 
4  file2  13-05-2016 12.02  fail 
5  file1  13-05-2016   success 
6  file3  13-05-2016   fail 

我想造成這樣的

fileName  12-05-2016 13-05-2016 
------------------------------------------ 
file1   success  sucess 
file2       fail 
file3       fail 

標準 - 兩個日期,所有的日期文件狀態應該顯示在以上方式之間的搜索數據。同一天存在同一個文件的兩個條目,則會顯示最新狀態。

我正在使用代碼第一種方法來獲取數據。

這是我在回購代碼

 IQueryable<FileData> filedata=this.context.FileData; 
+1

你介意分享你的第一部分進行的類,與你用來獲取數據的相關代碼沿樞軸表? – Svek

+2

請分享課程和結構的代碼。你需要做的是數據透視,所以檢查細節http://linqlib.codeplex.com/wikipage?title=Pivot&referringTitle=Home – bhuvin

+0

我需要這樣做的報告 –

回答

0

根據您的問題,這裏有一個例子類,將工作

public class FileStatus 
{ 
    public int? Id { get; set; } 
    public string Filename { get; set; } 
    public DateTime Date { get; set; } 
    public string Status { get; set; } 
} 

這裏是會得到你想要的結果的工作樣本,以便您可以將其傳遞到報告模板上:

var filedata= new List<FileStatus>() 
{ 
    new FileStatus(){ Id = 1, Filename = "file1", Date = new DateTime(2016,05,12,11,30,00), Status = "fail"}, 
    new FileStatus(){ Id = 2, Filename = "file1", Date = new DateTime(2016,05,12,11,35,00), Status = "success"}, 
    new FileStatus(){ Id = 3, Filename = "file2", Date = new DateTime(2016,05,13,12,01,00), Status = "success"}, 
    new FileStatus(){ Id = 4, Filename = "file2", Date = new DateTime(2016,05,13,12,02,00), Status = "fail"}, 
    new FileStatus(){ Id = 5, Filename = "file1", Date = new DateTime(2016,05,13,12,30,00), Status = "success"}, 
    new FileStatus(){ Id = 6, Filename = "file3", Date = new DateTime(2016,05,13,12,31,00), Status = "fail"} 
}; 

//remove the above and replace it with your own: 
//IQueryable<FileData> filedata = this.context.FileData; 

var result = filedata.GroupBy(c => new { c.Filename, c.Date.Date }).Select(c => new 
{ 
    Row = c.Key.Filename, 
    Column = c.Key.Date, 
    Value = filedata.FirstOrDefault(co => co.Id == c.Max(max => max.Id)).Status 
}).OrderBy(c => c.Row).OrderBy(c => c.Column); 
+0

,但這有效嗎? –

+0

@JavierJimenezMatilla - 是的。它需要放入報告模板。如果需要,我可以更新它來做一個簡單的透視。 – Svek

0

首先,您必須付費給我哈哈哈,所有的例子都是錯誤的(重複,1016年?,小時)。而不是:,沒有小時),我檢查你寫快......所以:

declare @cols nvarchar(max) 
declare @query nvarchar(max) 


CREATE TABLE [dbo].[Table_1](
    [id]   [int]   NULL, 
    [filename]  [nvarchar](50) NULL, 
    [date]   [datetime]  NULL, 
    [status]  [nvarchar](50) NULL 
) ON [PRIMARY] 

insert into table_1 
values 
(1  ,'file1'  ,'12-05-2016 11:30:00.000'  ,'fail'), 
(2  ,'file1'  ,'12-05-2016 11:35:00.000'  ,'success'), 
(3  ,'file2'  ,'13-05-2016 12:01:00.000'  ,'success'), 
(3  ,'file2'  ,'13-05-2016 12:02:00.000'  ,'fail'), 
(4  ,'file1'  ,'13-05-2016 12:03:00.000'  ,'success'), 
(5  ,'file3'  ,'13-05-2016 12:04:00.000'  ,'fail') 


select t2.filename,dat, status 
    into #temp1 
    FROM 
     (select filename, cast([date] as date) as dat, max([date]) as maxdat 
      from table_1 
      group by filename, cast([date] as date) 
     ) t1 
    INNER JOIN 
    table_1 t2 
     on t1.filename = t2.filename 
     and t2.[date] = t1.maxdat 
     and cast(t2.date as date) = t1.dat 

--select * from #temp1 
--after that you want pivot by date and max status for example¿? 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), datelist, 120)) 
        from 
        (
        select distinct cast(dat as date) as datelist from #temp1 
        )t1 

      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 
--select @cols 

set @query = 
('select filename, ' + @cols + ' 
    from #temp1 
    pivot (
     max(status) 
     for dat in (' + @cols + ') 
    )p 
') 

print @query 

exec(@query) 

希望這有助於你! $$

+0

這個例子是在tsql中,你可以創建一個存儲過程來讀取 –

1

我創建了一個基於Svek代碼

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      FileStatus filestatus = new FileStatus(); 
      filestatus.Load(); 
      DataTable pivot = filestatus.PivotTable(); 
     } 
    } 
    public class FileStatus 
    { 
     public static List<FileStatus> filedata = new List<FileStatus>(); 

     public int? Id { get; set; } 
     public string filename { get; set; } 
     public DateTime date { get; set; } 
     public string status { get; set; } 

     public void Load() 
     { 
      filedata = new List<FileStatus>() 
      { 
       new FileStatus(){ Id = 1, filename = "file1", date = new DateTime(2016,05,12,11,30,00), status = "fail"}, 
       new FileStatus(){ Id = 2, filename = "file1", date = new DateTime(2016,05,12,11,35,00), status = "success"}, 
       new FileStatus(){ Id = 3, filename = "file2", date = new DateTime(2016,05,13,12,01,00), status = "success"}, 
       new FileStatus(){ Id = 4, filename = "file2", date = new DateTime(2016,05,13,12,02,00), status = "fail"}, 
       new FileStatus(){ Id = 5, filename = "file1", date = new DateTime(2016,05,13,12,30,00), status = "success"}, 
       new FileStatus(){ Id = 6, filename = "file3", date = new DateTime(2016,05,13,12,31,00), status = "fail"} 
      }; 
     } 
     public DataTable PivotTable() 
     { 
      DataTable pivot = new DataTable(); 

      DateTime[] uniqueDates = filedata.Select(x => x.date.Date).Distinct().OrderBy(x => x).ToArray(); 

      pivot.Columns.Add("filename", typeof(string)); 
      foreach (DateTime date in uniqueDates) 
      { 
       pivot.Columns.Add(date.ToString("MM-dd-yyyy"), typeof(string)); 
      } 

      var groups = filedata.GroupBy(x => x.filename).ToList(); 

      foreach (var group in groups) 
      { 
       DataRow newRow = pivot.Rows.Add(); 
       newRow["filename"] = group.Key; 

       foreach (FileStatus filestatus in group) 
       { 
        newRow[filestatus.date.ToString("MM-dd-yyyy")] = filestatus.status; 
       } 
      } 
      return pivot; 
     } 
    } 
} 
+0

現在它已經超冷了!哈哈 –