2016-05-27 3 views
-2

II есть две таблицы данных следующим образомРазность двух DataTables в C# с помощью LINQ

dtOne 
------------------------- 
    ID | Name 
-------------------------- 
101 | ABC 
102 | XYZ 
103 | MNO 
104 | PQR 
-------------------------- 

dtTwo 
------------------------- 
    ID | Name 
-------------------------- 
101 | FGH 
102 | XYZ 
104 | GPS 
-------------------------- 

Я просто хочу результат в виде данных, которые in dtOne и not in dtTwo (dtOne-dtTwo)

dtResult 
------------------------- 
    ID | Name 
-------------------------- 
103 | MNO 
-------------------------- 

Как я могу достичь этого.

Я использовал (а) кроме метода LINQ, но этот результат дает 101 | ABC

103 | MNO 
104 | PQR 
101 | FGH 

104 | GPS 

То означает соответствие как столбец за исключением метода

+0

Что условие для выбора данных? –

ответ

0

Если вы пытаетесь найти строки, которые удовлетворяют критериям, на основе нескольких столбцов в DataTable, попробовать что-то вроде следующего

string stationToFind = "ABC"; 
DateTime dateToFind = new DateTime(2016, 5, 26); 
var result = dataTable.AsEnumerable().Where(row => row.Field<string>("station") == stationToFind 
       && row.Field<datetime>("date") == dateToFind).ToList(); 

Если вы ожидаете только одну строку, то вы можете использовать .FirstOrDefault() вместо .ToList()

+0

У меня есть не только ABC ,,, у меня много значений, которые повторяются – chandani

+0

Я точно не знаю, какие критерии вы ищете. Вам нужно найти все строки для конкретной станции? Или конкретная станция и диапазон дат? – Freeman

+0

не определенная станция ..... У меня есть datatable, в которой 4 столбца теперь я хочу фильтровать последние данные, основанные на datetime, а также uniqe station wise – chandani

0

Проверьте этот код, в точности согласно вашему требованию ent и Data, внести незначительные изменения в зависимости от требований. Это точно, как написано в заявлении GroupBy и используется в Sql

void Main() 
{ 
    var testData = Data.FetchDataList(); 

    testData.GroupBy(x => x.Station) 
      .ToDictionary(x => x.Key, x => x) 
      .Select(x => new { Station = x.Key, MaxTemp = x.Value.Max(n => n.MaxTemp),MinTemp = x.Value.Min(n => n.MinTemp),LocalDate = x.Value.Max(n => n.LocalDate)}); 


} 

public class Data 
{ 
    public string Station { get; set;} 

    public double MaxTemp { get; set;} 

    public double MinTemp { get; set;} 

    public DateTime LocalDate{ get; set;} 

    public static List<Data> FetchDataList() 
    { 
     return new List<Data> 
     { 
      new Data { Station = "XYZ", MaxTemp = 14.5, MinTemp = 3.5, LocalDate = new DateTime(2016,5,26)}, 
      new Data { Station = "XYZ", MaxTemp = 13.5, MinTemp = 3.5, LocalDate = new DateTime(2016,5,26)}, 
      new Data { Station = "ABC", MaxTemp = 14.5, MinTemp = 3.5, LocalDate = new DateTime(2016,5,26)}, 
      new Data { Station = "ABC", MaxTemp = 12.5, MinTemp = 5.5, LocalDate = new DateTime(2016,5,23)}, 
     }; 
    } 

} 
+0

Я должен фильтровать данные uniqe и последние .... не конкретные – chandani

+0

У вас есть даже поймите свое собственное заявление, если да, то объясните в лучшем виде, я не работаю, чтобы решить ваши конкретные заявления о проблемах –

+0

, пожалуйста, см. ... Я обновил свой вопрос – chandani

0
 DataTable dt = new DataTable(); 
     dt.Columns.Add("station", typeof(string)); 
     dt.Columns.Add("max_temp", typeof(double)); 
     dt.Columns.Add("min_temp", typeof(double)); 

     dt.Rows.Add("XYZ", 14.5, 3.5); 
     dt.Rows.Add("XYZ", 14.5, 3.5); 
     dt.Rows.Add("XYX", 13.5, 3.5); 
     dt.Rows.Add("ABC", 14.5, 5.5); 
     dt.Rows.Add("ABC", 12.5, 3.5); 
     dt.Rows.Add("ABC", 14.5, 5.5); 

     var maxvalue = dt.AsEnumerable().Max(s => s.Field<double>("max_temp")); 

     var coll = dt.AsEnumerable().Where(s => s.Field<double>("max_temp").Equals(maxvalue)). 
      Select(s => new { station = s.Field<string>("station"), maxtemp = s.Field<double>("max_temp"), mintemp = s.Field<double>("min_temp") }).Distinct(); 

     foreach (var item in coll) 
     { 
      Console.WriteLine(item.station + " - " + item.maxtemp + " - " + item.mintemp); 
     }