2011-03-08 61 views
3

如果我設置了查詢/結果如下選擇不同的行...LINQ到SQL:而忽略指定的列

from t1 in table1 
join t2 in table2 on t1.ID equals t2.ID 
join t3 in table3 on t2.ID equals t3.ID 
select new MyClass() 
{ 
    ID = t1.ID, 
    Name = t2.Name, 
    Rank = t2.Rank, 
    City = t3.City 
} 

ID | Name | City | Rank 
01 | Test | Fake | 876 
01 | Test | Fake | 755 
02 | Blah | Fake | 765 

做一個.Distinct()將返回所有3條記錄,但如果我想要第一個和第三個記錄,並且不想從結果集中刪除任何列?有我認爲這是可能的做到這一點使用羣體,而是一個方法來指定列做不同的時忽略,或明確包括在不同的,這樣我可以做這樣的事情......

// pseudo code 
.Distinct(o => o.Name.FirstOrDefault()) 

這似乎是緩慢和混亂,特別是如果我需要在多個列上分組以避免排除太多的行。有任何想法嗎?謝謝。

回答

5

不,您不能指定一個預測來確定Distinct的相等性。 (我有擴展方法爲LINQ這樣對對象,但是這是一個不同的問題。)

我建議你使用GroupBy,可能連同First

var query = from t1 in table1 
      join t2 in table2 on t1.ID equals t2.ID 
      join t3 in table3 on t2.ID equals t3.ID 
      select new { t1.ID, t2.Name, t2.Rank, t3.City } into tuple 
      group tuple by new { tuple.ID, tuple.Name, tuple.City } into grouping 
      let first = grouping.First() // For convenience 
      select new MyClass 
      { 
       ID = first.ID, City = first.City, 
       Name = first.Name, Rank = first.Rank 
      }; 

注意,這樣做的結果可能不是確定性的 - 你正在考慮每個組的第一個項目,忽略排名 - 所以你可以得到排名876的記錄,或者你可以在你的例子中得到排名爲755的記錄。

我不確切地知道這在SQL中會是什麼樣子 - 但您應該通過日誌記錄來檢查,然後運行查詢分析器來查看成本是多少。