none
LINQ to DataSet 可以用Linq 查出兩個DataTable 不相同的資料嗎? RRS feed

  • 問題

  • 請問~
    用Linq可以查出兩個DataTable 不相同的資料嗎?
    在網路上只查到可以用join查出兩個DataTable相同的資料,如果要把不同的列出來有辦法嗎?

    假設:
            Table1 = {1, 2, 3, 4, 5, 6}
            Table2 = {2, 3, 4, 5, 6, 7}
    我想要得到的結果是{1,7},用linq可以做到嗎??

    lichieh
    2009年12月23日 上午 08:45

解答

  • Table1.AsEnumerable().Except(Table2.AsEnumerable(), System.Data.DataRowComparer.Default);

    可以得到 1

    反之
    Table2.AsEnumerable().Except(Table1.AsEnumerable(), System.Data.DataRowComparer.Default);

    可以得到 7



    如果你想一次完成,參考看看
    Union
    var queryUnion = Table1.AsEnumerable().Union(Table22.AsEnumerable(), DataRowComparer.Default);

    Intersect
    var queryIntersect = Table1.AsEnumerable().Intersect(Table22.AsEnumerable(), DataRowComparer.Default);

    Expect
    var queryExpect = queryUnion.Expect(queryIntersect,  DataRowComparer.Default);

    queryExpect 應該就是你要的
    (當然你可以自己寫 IEqualityComparer ,看你的case 了)


    • 已提議為解答 Shelly Chen 2009年12月24日 上午 01:43
    • 已標示為解答 Lolota Lee 2009年12月24日 上午 02:37
    2009年12月23日 上午 09:28

所有回覆

  • ..........join同樣辦得到吧
    寫select的時候把你要的欄位抓出來就行了
    2009年12月23日 上午 09:19
  • Table1.AsEnumerable().Except(Table2.AsEnumerable(), System.Data.DataRowComparer.Default);

    可以得到 1

    反之
    Table2.AsEnumerable().Except(Table1.AsEnumerable(), System.Data.DataRowComparer.Default);

    可以得到 7



    如果你想一次完成,參考看看
    Union
    var queryUnion = Table1.AsEnumerable().Union(Table22.AsEnumerable(), DataRowComparer.Default);

    Intersect
    var queryIntersect = Table1.AsEnumerable().Intersect(Table22.AsEnumerable(), DataRowComparer.Default);

    Expect
    var queryExpect = queryUnion.Expect(queryIntersect,  DataRowComparer.Default);

    queryExpect 應該就是你要的
    (當然你可以自己寫 IEqualityComparer ,看你的case 了)


    • 已提議為解答 Shelly Chen 2009年12月24日 上午 01:43
    • 已標示為解答 Lolota Lee 2009年12月24日 上午 02:37
    2009年12月23日 上午 09:28
  • 多謝,參考你的回覆找到這裡有實際的範例,問題已解決,謝謝!
    http://msdn.microsoft.com/zh-tw/library/bb669119.aspx


    lichieh
    2009年12月24日 上午 01:21