2016-01-16 26 views
0

我嘗試創建lastReadings的分組,以創建客戶和競爭對手的價格。我嘗試下面的代碼,但這種方法並不能消除只有客戶端的讀數。在下面的表中,我需要消除讀數5和6,對於產品C和D,因爲沒有匹配並且只進一步傳遞可比較的產品。只有當一個組中的所有元素都具有列中的值時才與Linq分組

readingId ProductId  Distributor Price 
1   A    Competitor 8.0 
2   A    Client  8.1 
3   B    Competitor 8.3 
4   B    Client  8.4 
5   C    Client  8.8 
6   D    Client  8.9 

下面是我得到迄今:

private IEnumerable<PriceComparison> getPriceComparisons(string competitor) 
    { 
     IEnumerable<IGrouping<string, LatestReading>> groupingsByProductId = 
          from latestReading in LatestReadings 
          group latestReading by latestReading.ProductId; 


     IEnumerable<PriceComparison> priceComparisons 
      = from grouping in groupingsByProductId 
       select new PriceComparison 
       { 
        ProductId = grouping.Key, 
        MyPrice = (from latestReading in grouping 
          where latestReading.Distributor == Client 
          select latestReading.Price).FirstOrDefault(), 
        CompetitorPrice = (from latestRading in grouping 
            where latestRading.Distributor == competitor 
            select latestRading.Price).FirstOrDefault() 
       }; 
     return priceComparisons; 
    } 

其實在我寫這篇文章,我得出的結論是「無競爭」的附加創建分組,競爭對手的價格有沒有爲0,所以後來我可以輕鬆地消除這些分組和代碼工作。但是,不知何故,這種創建「空白」分組的方法並不合適,除了產品C和D之外,是否還有更好的方法來專注於分組?

+0

如果有兩個讀數相同的產品,這是否意味着他們中的一個是客戶端和其他競爭對手? –

+0

是的,但是可能會有更多的競爭對手同樣的產品 – Turo

回答

1

你可以做這樣的事情:

//... 

IEnumerable<PriceComparison> priceComparisons = 
       from grouping in groupingsByProductId 
       where grouping.Any(p => p.Distributor == Client) 
        && grouping.Any(p => p.Distributor == competitor) 
       select new PriceComparison 
       { 
       //.. 
       }; 

這可以確保你只能有兩個客戶和競爭對手價格的羣體。

+0

偉大的作品,謝謝雅各布 - 一些新的武器給我的小Linq阿森納:) – Turo

2

我覺得Join更適合你想什麼來實現的,這樣

var priceComparison = 
    from a in LatestReadings.Where(r => r.Distributor == Client) 
    join b in LatestReadings.Where(r => r.Distributor == Competitor) 
     on a.ProductId equals b.ProductId 
    select new PriceComparison 
    { 
     ProductId = a.ProductId, 
     MyPrice = a.Price, 
     CompetitorPrice = b.Price 
    }; 
+0

超級,非常感謝伊萬。我不改變我的接受,只是提出你的答案 - 但這是更簡單,但今天更令人大開眼界。 – Turo

+0

很好的答案。 +1 –

+0

請注意,如果客戶或競爭對手的閱讀資料不止一個,您將獲得同一產品ID的多個項目。 –

相關問題