LINQ выберите после группировки - PullRequest
2 голосов
/ 29 сентября 2011

Я пытаюсь вернуть набор результатов из сгруппированного запроса, и я не могу правильно выбрать. В LinqPad курсор переходит на «ItemID» в Grouped.Key.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 ]

1 голос
/ 29 сентября 2011

Что ж, при условии, что в базе данных настроены внешние ключи из bid -> item, нет необходимости все это присоединять к группе.

Ваши товары уже будут иметь коллекцию предложений.

Так что вы можете делать такие вещи, как:

 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. Попробуйте отказаться от написания SQL на Linq, но вместо этого используйте более объектно-ориентированный подход.

1 голос
/ 29 сентября 2011

Grouped.Key ссылается на поля, которые вы указали в сгруппированном по x предложении.В результате в вашем запросе Key = I.ItemID.

В вашем примере вместо того, чтобы думать с точки зрения SQL, где вам нужно сгладить иерархии, используйте OO-сущность LINQ и графов объектов.Немного адаптировав свой пример и настроив 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();
1 голос
/ 29 сентября 2011

Это говорит именно то, что написано.Groupped. Ключ будет содержать 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 голосов
/ 29 сентября 2011

В этой группе, ItemID является ключом.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 должен повторно запросить ключ группы, чтобы получить элементы каждой группы (так называемая проблема n + 1 с groupby).

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
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...