2012-01-20 8 views
3

からのLINQを使用して、重複するレコードを検索するには、私はメッセージの重複レコードを表示したい私のDataTableどのようにここでのDataTable

DataTable dt = new DataTable(); 
dt.Rows.Add(2,Test1,Sample1); 
dt.Rows.Add(2,Test2,Sample2); 
dt.Rows.Add(4,Test3,Sample3); 
dt.Rows.Add(4,Test4,Sample4); 
dt.Rows.Add(2,Test5,Sample5); 

はクラス4 のために存在している場合には、比較することによって、二つのループを使用することによりpossbileですが、私はしたいです私は重複したレコードを返す最適化されたコードと私はメッセージを表示します。コードはLinqを使っているかもしれません。

+1

「クラス4」とは何ですか?あなたはいつ重複していますか? –

答えて

19

最初の列の値が2つの以上の行で同一であるときに、重複したレコードを取得すると仮定すると:

DataTable dt = new DataTable(); 
dt.Columns.Add(); 
dt.Columns.Add(); 
dt.Columns.Add(); 
dt.Rows.Add(1, "Test1", "Sample1"); 
dt.Rows.Add(2, "Test2", "Sample2"); 
dt.Rows.Add(3, "Test3", "Sample3"); 
dt.Rows.Add(4, "Test4", "Sample4"); 
dt.Rows.Add(5, "Test5", "Sample5"); 

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList(); 
Console.WriteLine("Duplicate found: {0}", duplicates.Any()); 

dt.Rows.Add(1, "Test6", "Sample6"); // Duplicate on 1 
dt.Rows.Add(1, "Test6", "Sample6"); // Duplicate on 1 
dt.Rows.Add(3, "Test6", "Sample6"); // Duplicate on 3 
dt.Rows.Add(5, "Test6", "Sample6"); // Duplicate on 5 

duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList(); 
if (duplicates.Any()) 
    Console.WriteLine("Duplicate found for Classes: {0}", String.Join(", ", duplicates.Select(dupl => dupl.Key))); 

Console.ReadLine(); 
+0

お返事ありがとうございます、実際には私は最初の列にのみ重複を確認する必要があります。どうすれば確認できますか –

+0

それでは、さらに簡単です。私は最初の列にのみ重複のために働く答えを編集しました。 –

+0

ありがとうございます、それはクラス5の重複が見つかりましたので表示されません –

2

あなたはの交差を取得することができます:ここで

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1); 

は一例です2つのLINQクエリまたは結果。 交差は、2つのLINQ結果間の共通レコードを検索することを意味します。

これはその例です。

DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 
    DataColumn dc; 
    DataRow dr; 
    ds.DataSetName = "products"; 
    dt.TableName = "product"; 

    dc = new DataColumn("product_id",long.MaxValue.GetType()); 
    dt.Columns.Add(dc); 

    dc = new DataColumn("product_name"); 
    dt.Columns.Add(dc); 

    dr = dt.NewRow(); 
    dr["product_id"] = 1; 
    dr["product_name"] = "Monitor"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 2; 
    dr["product_name"] = "Mouse"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 3; 
    dr["product_name"] = "KeyBoard"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 4; 
    dr["product_name"] = "LCD"; 
    dt.Rows.Add(dr); 

    ds.Tables.Add(dt); 

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable() 
            where tbl.Field<long>(0) >=3 
            select tbl; 



    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable() 
            let product_name = tbl.Field<string>(1) 
            where product_name.StartsWith("Key") 
            || product_name.StartsWith("Mo") 
            select tbl; 




    IEnumerable<DataRow> objUnionResult = objResult1.Intersect(objResult2); 

    Response.Write("<br/><br/><b>Intersect Query Results</b>"); 
    foreach (DataRow row in objUnionResult) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    } 
    Response.Write("<br/><br/>"); 
関連する問題