我正在尝试从分组查询中返回结果集,但我无法获得正确的选择权。在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
答案 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
};