[英]C# Adding items to list causes duplicates
我想做一个循环,将一个对象添加到列表中。 每当我这样做时,它似乎一直在添加相同的对象。
private List<Events> GetEvents()
{
List<Events> dataEvents = new List<Events>();
MySqlConnection con = new MySqlConnection(cs);
con.Open();
string sql = "SELECT * FROM Events";
var cmd = new MySqlCommand(sql, con);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Events x = new Events(rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2), rdr.GetInt32(3), rdr.GetDateTime(4));
dataEvents.Add(x);
}
con.Close();
return dataEvents;
}
List<Events> newEvent = GetEvents();
下面是我如何构建我的 Events 类:
public class Events
{
private static int _ID;
private static string _Type;
private static int _UserID;
private static int _LokaalID;
private static DateTime _Created_On;
public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
{
_ID = id;
_Type = type;
_UserID = UserID;
_LokaalID = LokaalID;
_Created_On = Created_On;
}
public int ID { get { return _ID; } }
public string Type { get { return _Type; } }
public int UserID { get { return _UserID; } }
public int LokaalID { get { return _LokaalID; } }
public DateTime Created_On { get { return _Created_On; } }
}
[0] ID 38 int LokaalID 1 int Type "check_in" string UserID 114 int
[1] ID 38 int LokaalID 1 int Type "check_in" string UserID 114 int
[2] ID 38 int LokaalID 1 int Type "check_in" string UserID 114 int
这是我的数据库的样子,因此您可以看到它在我的数据库中没有重复:
Laurent 做到了; 永远不要使用static
除非你确切地知道它的用途..让你的事件看起来像这样:
public class Events
{
public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
{
ID = id;
Type = type;
UserID = UserID;
LokaalID = LokaalID;
Created_On = Created_On;
}
public int ID { get; set; }
public string Type { get; set; }
public int UserID { get; set; }
public int LokaalID { get; set; }
public DateTime Created_On { get; set; }
}
但是一旦你解决了这个问题,试试这个; 以后你可能会因为不同的原因感谢我!
private List<Events> GetEvents()
{
using var con = new MySqlConnection(cs);
return conn.Query<Event>("SELECT * FROM Events").ToList();
}
是的.. 这就是你所要做的*; Dapper 将创建对象、打开/关闭连接、读取数据、将其填充到对象中等等。
*好了,除非你的C#属性名称不与列名称保持一致,在这种情况下,使用AS
所以他们的比赛重新命名列:
//assume the column is called EventId and the C# prop is ID
conn.Query<Event>("SELECT EventId as ID, ... FROM Events").ToList()
要进行参数化查询:
conn.Query<Event>("SELECT * FROM Events WHERE ID = @someId", new { someId = 123 }).ToList()
它确实负载更多,但这应该让您开始,并且意味着您不必花费数小时编写最乏味的GetInt, GetString, Get.. Get..
人类已知的代码..
您的事件类具有静态的私有字段,因此这些字段的值对于您的所有事件实例都是通用的……
这将是正确的代码。 它可以简化,具体取决于您使用的 .NET 版本。
public class Events
{
private int _ID;
private string _Type;
private int _UserID;
private int _LokaalID;
private DateTime _Created_On;
public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
{
_ID = id;
_Type = type;
_UserID = UserID;
_LokaalID = LokaalID;
_Created_On = Created_On;
}
public int ID { get { return _ID; } }
public string Type { get { return _Type; } }
public int UserID { get { return _UserID; } }
public int LokaalID { get { return _LokaalID; } }
public DateTime Created_On { get { return _Created_On; } }
}
编写此代码的现代方式(C# 9)是
public class Events
{
public int ID { get; init; }
public string Type { get; init; }
public int UserID { get; init; }
public int LokaalID { get; init; }
public DateTime Created_On { get; init; }
}
旁注:当你的类为一个事件建模时,为什么称它为事件?
从您的字段中删除静态修饰符:
public class Events
{
private int _ID;
private string _Type;
private int _UserID;
private int _LokaalID;
private DateTime _Created_On;
public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
{
_ID = id;
_Type = type;
_UserID = UserID;
_LokaalID = LokaalID;
_Created_On = Created_On;
}
public int ID { get { return _ID; } }
public string Type { get { return _Type; } }
public int UserID { get { return _UserID; } }
public int LokaalID { get { return _LokaalID; } }
public DateTime Created_On { get { return _Created_On; } }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.