2011-07-11 84 views
1

我有一個類似如下的EnumerableRowCollection:LINQ SELECT DISTINCT在評價多行

VendorCode | GroupType | Variance 
    01165  G   .16 
    01165  G   .16 

    01165  CH   .16 
    01165  CH   .18 

    07754  G   .25 
    07754  G   .25 
    07754  G   .39 

從本質上講,這是供應商代碼,它們的羣體,而價格差異巨大名單。我需要編寫一個查詢來創建一個不同的列表供應商代碼和組類型。但是,我需要評估與特定VendorCode/GroupType相關的所有差異,看看它們是否完全相同 - 它不是,我需要返回某種表示該組具有「自定義「方差,否則它需要返回值(即:如果它們都是.16,則返回.16,如果有多個值,則返回」custom「)

結果看起來像這樣,基於關閉我上面列出的名單。

VendorCode | GroupType | Variance 
    01165  G   .16 
    01165  CH   custom 
    07754  G   custom 

我有沒有麻煩VENDORCODE/GroupType的一個獨特的名單 - 這是我到目前爲止有:

Dim distinctList = From q In query Select q.VendorCode, q.GroupType, (evaluated q.Variance here?) Distinct 

(其中 「查詢」 是一個EnumerableRowCollection(中(匿名類型)) )

雖然我對如何評估方差屬性以獲得我需要的結果感到茫然 - 任何想法?

回答

2

我不能做VB,但在C#我想你想要的東西,如:

var query = from item in source 
      group item by new { item.VendorCode, item.GroupType } into g 
      select new { g.Key.VendorCode, 
         g.Key.GroupType, 
         Variance = ComputeVariance(g) }; 

... 

string ComputeVariance(IEnumerable<YourItemType> group) 
{ 
    var distinctVariance = group.Select(x => x.Variance) 
           .Distinct(); 
    using (var iterator = distinctVariance.GetEnumerator()) 
    { 
     iterator.MoveNext(); // Assume this will return true... 
     var first = iterator.Current; 
     return iterator.MoveNext() ? "custom" : first.ToString(); 
    } 
} 

這是假設你使用LINQ到對象。如果你需要在LINQ to SQL等中這樣做,我會採取一種稍微不同的方法。