分组后选择LINQ

时间:2011-09-29 06:05:52

标签: linq-to-sql select grouping

我正在尝试从分组查询中返回结果集,但我无法获得正确的选择权。在LinqPad中,光标跳转到Grouped.Key.ItemID中的“ItemID”,错误为:

'int'不包含'ItemID'的定义,并且没有扩展方法'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
}

我希望返回集包含由ItemID,ItemName和所有关联的出价记录组成的记录。

非常感谢,

BK

4 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分: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,而是使用更面向对象的方法。

答案 2 :(得分:1)

Grouped.Key是指您在按x分组分组中指定的字段。作为查询的结果,Key = I.ItemID。

在您的示例中,不是从SQL透视图中考虑必须展平heirarchies,而是接受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();

答案 3 :(得分:0)

在此groupby中,ItemID是Key。 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
};

这是一个使用GroupJoin做同样事情的版本。

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