2012-02-07 122 views
39

我有一個查詢,結合了一個連接和一個組,但我有一個問題。查詢是這樣的:LINQ:結合連接和組

var result = from p in Products       
join bp in BaseProducts on p.BaseProductId equals bp.Id      
group p by p.SomeId into pg       
select new ProductPriceMinMax { 
     SomeId = pg.FirstOrDefault().SomeId, 
     CountryCode = pg.FirstOrDefault().CountryCode, 
     MinPrice = pg.Min(m => m.Price), 
     MaxPrice = pg.Max(m => m.Price), 
     BaseProductName = bp.Name <------ can't use bp. 
}; 

正如你看到的,它加入與BaseProducts表Products表和組產品上的表的ID。但在生成的ProductPriceMinMax中,我還需要BaseProducts表的一個屬性:bp.Name,但它不知道bp。

任何想法我做錯了什麼?

謝謝!

回答

64

一旦你做到了這一點

group p by p.SomeId into pg 

你不再有機會獲得在初始from使用的範圍變量。也就是說,你不能再談論pbp,你只能說pg。現在

pg等都含有多個產品。給定pg組中的所有產品都具有相同的SomeId(因爲這就是你所分組的),但我不知道它們是否都具有相同的BaseProductId

爲了得到一個基本產品的名稱,你必須選擇一個特定產品的pg組(如你與SomeIdCountryCode做),並然後加入到BaseProducts

var result = from p in Products       
group p by p.SomeId into pg       
// join *after* group 
join bp in BaseProducts on pg.FirstOrDefault().BaseProductId equals bp.Id   
select new ProductPriceMinMax { 
     SomeId = pg.FirstOrDefault().SomeId, 
     CountryCode = pg.FirstOrDefault().CountryCode, 
     MinPrice = pg.Min(m => m.Price), 
     MaxPrice = pg.Max(m => m.Price), 
     BaseProductName = bp.Name // now there is a 'bp' in scope 
}; 

這就是說,這看起來很不尋常,我認爲你應該退一步考慮你實際試圖找回的東西。

+1

這比我們的解決方案好:)謝謝。 – 2012-02-07 09:44:37

+1

看看http://stackoverflow.com/a/2877012/1923685 – 2014-03-25 11:00:52

+0

@AakashM謝謝。但是我用groupVariable.FirstOrDefault()。column_name獲取問題。當我要訪問IQueryable變量Result時,發生錯誤,其標題是**「entitycommandexecutionexception未被用戶代碼處理」** with body ***「執行命令定義時發生錯誤。有關詳細信息,請參閱內部異常「***我無法理解發生了什麼。 – 2016-02-03 06:22:51

17

我們這樣做是這樣的:

from p in Products       
join bp in BaseProducts on p.BaseProductId equals bp.Id      
where !string.IsNullOrEmpty(p.SomeId) && p.LastPublished >= lastDate       
group new { p, bp } by new { p.SomeId } into pg  
let firstproductgroup = pg.FirstOrDefault() 
let product = firstproductgroup.p 
let baseproduct = firstproductgroup.bp 
let minprice = pg.Min(m => m.p.Price) 
let maxprice = pg.Max(m => m.p.Price) 
select new ProductPriceMinMax 
{ 
SomeId = product.SomeId, 
BaseProductName = baseproduct.Name, 
CountryCode = product.CountryCode, 
MinPrice = minprice, 
MaxPrice = maxprice 
}; 

編輯:我們使用AakashM的版本,因爲它具有更好的性能

4

我遇到了同樣的問題,因爲你。

我將兩個tablesresult分爲t1對象和組t1

from p in Products       
    join bp in BaseProducts on p.BaseProductId equals bp.Id 
    select new { 
    p, 
    bp 
    } into t1 
group t1 by t1.p.SomeId into g 
select new ProductPriceMinMax { 
    SomeId = g.FirstOrDefault().p.SomeId, 
    CountryCode = g.FirstOrDefault().p.CountryCode, 
    MinPrice = g.Min(m => m.bp.Price), 
    MaxPrice = g.Max(m => m.bp.Price), 
    BaseProductName = g.FirstOrDefault().bp.Name 
};