问题描述
如果我想从表 Person
中选择一条记录,那么我会写这样的查询。
using (var connection = new sqliteConnection(System.IO.Path.Combine(folder,"Persons.db")))
{
connection.Query<Person>("SELECT * FROM Person Where Id=?",Id);
return true;
}
但是如果我想对多个表或动态表使用相同的四行怎么办?我想传递动态表名而不是人。像这样。
void SelectDataForId(string tablename,int id)
{
using (var connection = new sqliteConnection(System.IO.Path.Combine(folder,"Persons.db")))
{
connection.Query<tablename>("SELECT * FROM "+tablename"+ Where Id=" + id);
return true;
}
}
我也尝试使用通用类型的 T,但我猜我做错了。
void SelectDataForId<T>(T obj,string tablename,"Persons.db")))
{
var type = GetValue<T>(tablename);
connection.Query<type>("SELECT * FROM "+tablename"+ Where Id=" + id);
return true;
}
}
public static T GetValue<T>(string value)
{
return (T)Convert.ChangeType(value,typeof(T));
}
请纠正我的错误。
谢谢
解决方法
根据此 SO post,您不能对表名使用参数。我们所做的是将表示所需实体记录的类作为泛型类型传入:
// IRecord is the base class for all our DB entity classes
List<T> SelectDataForId<T>(int id) where T : IRecord,new()
{
string tableName = typeof(T).Name;
List<T> list = _connection.Query<T>("SELECT * FROM " + tableName,id);
return list;
}