如何处理来自sqlite查询的数据?

时间:2018-03-21 11:49:28

标签: c# ado.net

我有一个获取以下数据的sqlite查询:

    private GetAllPlayerAttributesFromDB()
{
    IDbCommand dbcmd = dbconn.CreateCommand();

    string sqlQueryPlayer = "SELECT player_id, ability_id, value FROM playerabilities";
    dbcmd.CommandText = sqlQueryPlayer;
    IDataReader reader = dbcmd.ExecuteReader();

    IDictionary<int, int> dict = new Dictionary<int, int>();

    while (reader.Read())
    {
      int player_id = reader.GetInt32(0);
      int ability_id = reader.GetInt32(1);
      int value= reader.GetInt32(2);

       // I have no idea how to save the data now
       dict.Add(ability_id, value);
    }

    reader.Close();
    reader = null;
    dbcmd.Dispose();
    dbcmd = null;
}



╔════════════╦════════════╦═══════╗
║ player_id  ║ ability_id ║ value ║
╠════════════╬════════════╬═══════╣
║ "16"       ║ "0"        ║ "56"  ║
║ "16"       ║ "1"        ║ "52"  ║
║ "16"       ║ "2"        ║ "62"  ║
║ "16"       ║ "3"        ║ "72"  ║
║ "16"       ║ "4"        ║ "64"  ║
║ "28"       ║ "0"        ║ "41"  ║
║ "28"       ║ "1"        ║ "49"  ║
║ "28"       ║ "2"        ║ "55"  ║
║ "28"       ║ "3"        ║ "60"  ║
║ "28"       ║ "4"        ║ "65"  ║
║ "41"       ║ "0"        ║ "72"  ║
║ "41"       ║ "1"        ║ "71"  ║
║ "41"       ║ "2"        ║ "79"  ║
║ "41"       ║ "3"        ║ "84"  ║
║ "41"       ║ "4"        ║ "52"  ║
╚════════════╩════════════╩═══════╝

我希望如何使用数据: 我想通过使用他的player_id作为关键来获得一个玩家的所有能力和价值。例如,如果我需要来自播放器16的数据,那么我想获得(0,56),(1,52),(2,62)...或者具有int []值= [56,52,每个球员都有62,72,64。

现在我想以高效的方式保存这些数据。在PHP中,我将使用关联数组。我怎么能在C#中做到这一点? (我已经阅读了一些关于字典的例子,但是我无法将它们用于我的问题。也许字典是错误的方法吗?)

2 个答案:

答案 0 :(得分:2)

对于您已经拥有的代码,最简单的事情可能就是填充DataTable这是一个内存中的表#34;。它有行和列。

IDataReader reader = dbcmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
  

更新

加载数据表后,您可以将数据转换为玩家实例(例如)。

鉴于这些课程:

class PlayerDetails
{
    public string AbilityID { get; set; }
    public string Value { get; set; }
}

class Player
{
    public string PlayerID { get; set; }
    public List<PlayerDetails> Details { get; set; }
}

您可以获得List<Player>每个Details属性,其中包含List<PlayerDetails>

var groupedByPlayer = dt.AsEnumerable().GroupBy(d => d["player_id"]).Select(b => new
    Player
{
    PlayerID = b.Key.ToString(),
    Details = b.Select(bp => new PlayerDetails
    {
        AbilityID = bp[1].ToString(),
        Value = bp[2].ToString()
    }).ToList()
});

如果您不熟悉Linq,那可能看起来很丑陋,但是如果您了解SQL GROUP BY,那么除非您最终得到Player类的实例。

答案 1 :(得分:1)

您需要定义一个数据结构来保存您的数据。

一个简单的就是一个代表一行

的类
public class Player
{
   public int Id {get; set;}
   public int Ability {get;set;}
   public int Value {get;set;}
}

并将每行添加到List<Player> 但是,每个玩家将有5行。

另一种选择是仅仅是能力/价值的类

public class AbilityValue
{
   public int Ability {get;set;}
   public int Value {get;set;}
}

并将其存储在Dictionary<int, List<AbilityValue>>中。这需要一些解释:

  • 关键是player_id
  • 该值是您阅读的能力/值对列表

使用方法:

  • 从数据中读取一行
  • 查看您的词典中是否已有该密钥
  • 如果是,请将新的能力/值添加到该列表
  • 如果没有,请添加一个以player_id为键的新项目。不要忘记初始化该列表

如果您知道“Ability”始终在0到4之间,您还可以使用大小为5的数组作为字典的值。然后使用该功能作为该数组的索引来设置值。