2013-08-15 3 views
1

Мой вопрос похож слишком THISСлияние двух DataTables с LINQ

У меня есть два DataTables:

DataTable 1:

Column 1: Date 
Column 2: Requests 1 

DataTable 2:

Column 1: Date 
Column 2: Requests 2 

мне нужен сильфона результат:

Новый DataTable:

Column 1: Date 
Column 2: Requests 1 
Column 3: Requests 2 

Ожидаемый результат:

Date   Requests 1 Requests 2 Total 
15/08/2013  25   40   60 
14/08/2013  40   60   100 
13/08/2013  40   0    25 
12/08/2013  0   80   80 

То, что я делал до настоящего времени:

DataTable Lista_1 = ds.Tables[0]; 
DataTable Lista_2 = ds.Tables[1]; 

var myLINQ = from l1 in Lista_1.AsEnumerable() 
      join l2 in Lista_2.AsEnumerable() 
      on l1.Field<DateTime>("Date") equals l2.Field<DateTime>("Date") 
      select new 
      { 
       dateRelatorio = l1.Field<DateTime>("Date"), 
       request1Relatorio = l1.Field<int>("Total"), 
       request2Relatorio = l2.Field<int>("contagem"), 
       total = l1.Field<int>("Total") + l2.Field<int>("contagem") 
      }; 

И I хотел бы вернуть IList коллекцию (System.Collections.IList)

UPDATE

listReturn = new List<Stats>(); 
public class Stats 
{ 
public DateTime dateRelatorio { get; set; } 
public int request1Relatorio { get; set; } 
public int request2Relatorio { get; set; } 
public int total { get; set; } 
} 

UPDATE 2

Может иметь даты в List_1, что Eсть не List_2 и наоборот, так Запрос должен быть 0.

+3

Код кажется прекрасным, просто добавьте '.ToList()' – SWeko

+1

'Ilist '? Вы не можете вернуть анонимный тип из метода. –

+0

Что делать, если в первой таблице три строки с датой «15/08/2013» и две строки с одинаковой датой во второй таблице? Вам нужно 6 строк в таблице результатов? –

ответ

1

Если вам нужна эта вещь для инкапсуляции в методе, вы должны создать класс для возврата:

public class DailyReport 
{ 
    public DateTime Date {get; set;} 
    public int Requests1 {get; set;} 
    public int Requests2 {get; set;} 
    public int Total // this can be calculated on the fly 
    { 
    get {return Requests1 + Requests2; } 
    } 
} 

А потом сделать

public List<DailyReport> GetDailyReports(..parameters if needed...) 
{ 
    ... 
    var myLINQ = from ... 
     select new DailyReport { 
      Date = l1.Field<DateTime>("Date"), 
      Requests1 = l1.Field<int>("Total"), 
      Requests2 = l2.Field<int>("contagem"), 
     }; 
    return myLINQ.ToList(); 
} 

Есть некоторые грязные хаки, которые могли бы позволить вам вернуть коллекцию анонимных объектов, но я советовал бы против него.

+0

Мы почти там. У меня только один вопрос. Когда List_1 имеет дату, нет в List_2, запрос в List_2 должен быть 0 и наоборот, как и мой ожидаемый результат. – Willian

Смежные вопросы