2009-10-12 26 views
5

下面一列是我的代碼:如何使用一個獨特的使用LINQ

var query = from row1 in table.AsEnumerable() 
         let time = row1.Field<DateTime>("time") 
         let uri = row1.Field<string>("cs-uri-stem") 
         let ip = row1.Field<string>("c-ip") 
         let questionid = row1.Field<int>("questionid") 
         where questionid == int.Parse(table.Rows[x]["questionid"].ToString()) 
         select new 
         { 
          time, 
          uri, 
          ip, 
          questionid 
         }; 

IP列應該是唯一的。我不能在ip字段中有重複的項目。是否有可能在linq執行此操作

回答

7

你可以達到你想要的東西,通過IP地址的分組,但隨後你需要知道你是怎麼想辦理其他字段,當你有重複。

var query = from row1 in table.AsEnumerable() 
        let time = row1.Field<DateTime>("time") 
        let uri = row1.Field<string>("cs-uri-stem") 
        let ip = row1.Field<string>("c-ip") 
        let questionid = row1.Field<int>("questionid") 
        where questionid == int.Parse(table.Rows[x]["questionid"].ToString()) 
        group by ip into g 
        select new 
        { 
         time = g.time.First(), 
         uri = g.uri.First(), 
         ip = g.Key, 
         questionid = g.questionid.First() 
        }; 
+0

這很好。謝謝 – Luke101

2

您只能在所選的所有字段上執行Distinct,而不只是在一個字段上(其他字段的值是多少?)。

您可以通過使用Distinct擴展方法做到這一點:

 var query = (from row1 in table.AsEnumerable() 
        let time = row1.Field<DateTime>("time") 
        let uri = row1.Field<string>("cs-uri-stem") 
        let ip = row1.Field<string>("c-ip") 
        let questionid = row1.Field<int>("questionid") 
        where questionid == int.Parse(table.Rows[x]["questionid"].ToString()) 
        select new 
        { 
         time, 
         uri, 
         ip, 
         questionid 
        }).Distinct(); 
2

您還可以使用Distinct()與相等比較器(即,通過在將比較IP值的方法,而忽略其他)。但正如tvanfosson所問,處理重複值的正確程序是什麼?