2012-02-07 24 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. 
}; 

ご覧のとおり、それはProductテーブルのIDにBaseProductsテーブルとProductsテーブルを結合し、そしてグループ:のようなクエリがあります。しかし、結果として得られるProductPriceMinMaxには、BaseProductsテーブルのプロパティ(bp.Name)が必要ですが、bpは分かりません。

私が間違っていることを知っていますか?

ありがとうございます!

答えて

64

あなたは、もはや初期fromで使用される範囲変数へのアクセス権を持っているこの

group p by p.SomeId into pg 

を行わなかったら。つまり、pまたはbpについては話すことができません。pgについてのみ話すことができます。

さて、pgグループあるので、つ以上のの製品が含まれています。指定されたpgグループのすべての商品は同じSomeId(これはあなたがグループ化したものです)ですが、すべてが同じであることを意味するかどうかはわかりませんBaseProductId

ベースの製品名を取得するには(あなたがSomeIdCountryCodeでやっていると)、あなたはpgグループ内の特定の製品を選択する必要があり、かつその後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

これは私たちの解決策よりも優れています:)ありがとう。 –

+1

look @stackoverflow.com/a/2877012/1923685 –

+0

@AakashMありがとうございます。しかし、私はgroupVariable.FirstOrDefault()。column_nameで問題を取得しています。 IQueryable変数にアクセスしようとすると、どの見出しが**であるかのエラーが発生しました。 "entitycommandexecutionexceptionはユーザーコード" ** body ***で処理されませんでした ""コマンド定義の実行中にエラーが発生しました。 "***何が起きているのか分かりません。 –

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 
}; 

はEDIT:それは良いパフォーマンス

4

私はあなたと同じ問題に会っを持っているので、我々は、AakashMのバージョンを使用していました。

私は2つを押しますtablesresultt1オブジェクトとグループ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 
}; 
関連する問題