2016-07-25 3 views
0

ВЕР datebase схемы является то выглядеть следующим образом:LINQ, как объединить два столбца в один столбец результата запроса

enter image description here

и возьмите, пожалуйста, посмотрите на запрос ниже (я хочу, чтобы получить инвентарь игрока 5000 для игры с GameID 1001):

var gameID=1001; 
var playerID=5000; 
var q = from p in Players 
     join gp in GamePlays on p.PlayerID equals gp.PlayerID 
     join gpi in GamePlayItems on gp.GamePlayID equals gpi.GamePlayID   
     join it in Items on gpi.ItemID equals it.ItemID 
     where p.PlayerID == playerID 
     where it.GameID == gameID 

select new 
{ 
    GamePlayID = gp.GamePlayID, 
    ItemName = it.ItemName, 
    ItemValue = gpi.ItemValue, 
}; 
q.Dump(); 

результат показан ниже:

enter image description here

, но я не хочу, чтобы колонка GamePlayID повторялась. Я хочу получить только запись, в которой второй столбец имеет хеш-набор или список содержит «Запасы» (я хочу объединить столбцы два и три в одном столбце). как это можно достичь? например, мой результат желание:

GamePlayID  Items 
---------  ----- 
6    A List => { (ItemName1, ItemValue1), ....} 

UPDATE:

по ruuning Гилада Зеленый запрос получается нечто выглядеть следующим образом: запрос:

var q = (from p in db.Players 
      join gp in db.GamePlays on p.PlayerID equals gp.PlayerID 
      join gpi in db.GamePlayItems on gp.GamePlayID equals gpi.GamePlayID 
      join it in db.Items on gpi.ItemID equals it.ItemID 
      where p.PlayerID == playerID 
      where it.GameID == gameID 
      group new 
      { 
       ItemName = it.ItemName, 
       ItemValue = gpi.ItemValue 
      } 
      by new 
      { 
       gp.GamePlayID, 
       gp.BestTimeRecord, 
       gp.PlayedNumber, 
       gp.ScoreNumber, 
       gp.WinNumber 
      } 

      into groups 
      select new { Statictics = groups.Key, Items = groups }).ToList(); 

enter image description here

но я не хочу иметь ключ в элементах ... почему это o ccurs?

UPDATE 2:

оба ответа Ивана Стоев, Гилад Зеленый правильны ...

+0

Группа от GamePlayID? –

+0

@ J.Steen: вы можете помочь для этого. –

ответ

4

Попробуйте этот запрос для group by:

from p in Players 
join gp in GamePlays on p.PlayerID equals gp.PlayerID 
join gpi in GamePlayItems on gp.GamePlayID equals gpi.GamePlayID 
join it in Items on gpi.ItemID equals it.ItemID 
where p.PlayerID == playerID 
where it.GameID == gameID 

group new 
{ 
    ItemName = it.ItemName, 
    ItemValue = gpi.ItemValue 
} 
by new 
{ 
    GamePlayID = gp.GamePlayID 
    //Here you add other keys you want 
} into groups 

select new { GamePlayID = groups.Key.GamePlayID, Items = groups.ToList() }; 
+0

спасибо, очень приятно, но как я могу добавить несколько ключей, могу ли я использовать новые {...} –

+0

@SAParkhid - Ya - отредактированный ответ –

+0

, пожалуйста, смотрите мое обновление под вопросом, выполнив ваш запрос ... –

3

Там нет необходимости для группировки, вы можете просто превратить соединение в (GamePlayItems, Items) в group join следующим образом:

var q = 
    from p in Players 
    where p.PlayerID == playerID 
    join gp in GamePlays on p.PlayerID equals gp.PlayerID 
    join x in (
     from gpi in GamePlayItems   
     join it in Items on gpi.ItemID equals it.ItemID 
     where it.GameID == gameID 
     select new { gpi, it }) 
    on gp.GamePlayID equals x.gpi.GamePlayID into items 
    select new 
    { 
     GamePlayID = gp.GamePlayID, 
     Items = items.Select(x => new { ItemName = x.it.ItemName, ItemValue = x.gpi.ItemValue }).ToList(), 
    }; 
+0

это хорошо, но если у игрока больше одного GamePlays, запрос выше вернет все из них, но без каких-либо разработок. –

+1

В моем понимании «GamePlayID» является ПК в «GamePlays», поэтому данные уже «естественно» сгруппированы по «GamePlayID». Если вы имеете в виду, что групповое объединение возвращает записи, даже если нет связанных субзаписей, это верно, то объединение группы имеет левую внешнюю семантику объединения. Добавление 'where items.Any()' перед предложением 'select' исключает этот случай. В общем, я избегаю группировки по PK в моих запросах, для ваших - это зависит от вас :) –

+0

Я верю, и ваш запрос хорош, но я принял ответ раньше! –

Смежные вопросы