2011-09-29 64 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