2011-09-29 73 views
2

後,我無法得到正確的選擇。在LinqPad中,光標跳轉到Grouped.Key.ItemID中的「ItemID」,並顯示以下錯誤:LINQ選擇我試圖返回從分組查詢的結果集分組

'int'不包含'ItemID'的定義,也沒有接受'int 「可以發現

這裏的查詢:

from B in Bids 
join I in Items on B.ItemID equals I.ItemID 
group new {B, I} by I.ItemID into Grouped 
select new { 
    ItemID = Grouped.Key.ItemID, 
    ItemName = Grouped.Key.ItemName, 
    Bids = Grouped.Key.B 
} 

我想返回設置有由條目標識,ITEMNAME和所有相關的投標記錄的記錄。

非常感謝,

BK

回答

1

的Grouped.Key指的是你在用X子句中的分組specied場(一個或多個)。結果在你的查詢中,Key = I.ItemID。

在你的榜樣,而不是從那裏您可以拉平heirarchies的SQL角度思考,擁抱LINQ的OO性質和對象圖。調整您的示例並設置LINQPad以使用C#語句,我認爲您最終會得到更多您正在尋找的內容。注意:Dump()擴展方法特定於LINQPad以輸出結果並顯示結果。

var bids = new [] { new { ItemID = 1, BidValue = 30 } , new {ItemID=1, BidValue=45}}; 
var items = new [] { new { ItemID = 1, ItemName = "x" }, new {ItemID = 2, ItemName="y"} }; 

var query = from i in items 
      select new 
      { 
      i.ItemID, 
      i.ItemName, 
      Bids = from b in bids 
        where b.ItemID == i.ItemID 
        select b 
      }; 

query.Dump(); 

這就是說,您的類別表示LINQ to SQL。如果你的模型是在LINQ to SQL或EF,你可以做到這一點更容易使用映射的關聯:

var query = from i in dc.Items 
      select new 
      { 
       i.ItemID, 
       i.ItemName, 
       i.Bids 
      }; 

query.Dump(); 
+0

這是Linq到SQL和底部查詢返回我正在尋找。你之前的回答也說明了完全相同的查詢,但我會將你的答案標記爲答案,因爲你實際上已經與真正的問題掛鉤了。在我學習LINQ的過程中,我正在艱難地放棄我的SQL方法,並在三維空間中進行思考。感謝大家的幫助! – BKahuna

1

,說什麼寫。 Groupped.Key將包含I.ItemID,但不包含整個I.因此,您無法編寫Groupped.Key.ItemID

考慮:

from B in new [] { new { ItemID = 1, BidValue = 30 } } 
join I in new [] { new { ItemID = 1, ItemName = "x" } } on B.ItemID equals I.ItemID 
group new { B, I } by I into Groupped 
select new { 
    ItemID = Groupped.Key.ItemID, 
    ItemName = Groupped.Key.ItemName, 
    Bids = (from g in Groupped select g.B).ToList() 
} 
+0

我一直在尋找正確的方法來做這個投標列表分組和你的工作後,灼熱SO和其他網站的大部分時間,謝謝! – Wil

1

好吧,假設你有外鍵設置在從申辦數據庫 - >項目沒有必要爲這一切都加入一個分組。

你的項目就已經在他們的出價的集合。

所以你可以做這樣的事情:

var x = db.Items.Single(i=>ItemId == 1); // get one item 
foreach (bid b in x.Bids) // iterate through all the bids 
{} 

如果你真的想有他們在一個匿名類型,這將做到:

from i in db.items 
select new { i.ItemID, i.ItemName, i.Bids } 

也就是說LINQ2SQL的美感。試着放棄在Linq中編寫SQL,而是使用更多面向對象的方法。

0

在這種GROUPBY,條目標識號是關鍵。 ItemID沒有B屬性。

group new {B, I} by I.ItemID into Grouped 

這裏是您查詢其正常訪問組的改進版本。

from b in Bids 
join i in Items on b.ItemID equals i.ItemID 
group b by i into groupedBids 
select new 
{ 
    Item = i, 
    Bids = groupedBids 
}; 

下面是一個使用到羣組加入做同樣的事情的一個版本。

from i in Items 
join b in Bids on i.ItemID equals b.ItemID into groupedBids 
select new 
{ 
    Item = i, 
    Bids = groupedBids 
}; 

這裏,它的數據庫和組加入本地版本。您可能會這樣做,因爲LinqToSql必須通過組的密鑰重新查詢以獲取每個組的元素(稱爲groupby的n + 1問題)。

from x in 
(
    from i in Items 
    join b in Bids on i.ItemID equals b.ItemID 
    select new {Item = i, Bid = b} 
).ToList() 
group x.b by x.i into groupedBids 
select new 
{ 
    Item = groupedBids.Key, 
    Bids = groupedBids 
}; 
+0

最後一個效率不高。更好的解決DataContext上LoadOptions的N + 1問題 – Pleun