我一直使用linq从sql获取数据。它快速且易于使用但我听说与普通查询相比,它需要更多来自服务器的资源。
所以..我现在正试图改善查询..
我想要的是通过查询从数据库中检索用户。
是否可以做这样的事情:
用户模型:
[Key]
public int UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string PasswordSalt { get; set; }
public string Money { get; set; }
查询:
public User GetUser(string userName)
{
string sql = "SELECT * FROM Users WHERE UserName = @UserName";
User user = null;
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.Parameters.Add("@userName", SqlDbType.VarChar, 12).Value = userName;
connection.Open();
user = (User)cmd.ExecuteReader();
}
catch
{
}
}
return user;
}
或者我是否被迫使用datareader并将每个单元格插入到新的用户模型中,然后将其返回?
//新手
更新1:
如果我希望结果是用户模型的泛型集合,我将如何继续?
答案 0 :(得分:1)
不,与Linq和ORM图层不同,基本的ADO不会从数据库映射到实体。您必须阅读每个列值并自行分配给每个属性。
但是,您可能想尝试Dapper。它确实支持您尝试执行的操作,同时仍保留SQL的低级语法,速度和效率。它被实现为IDbConnection的扩展方法。
答案 1 :(得分:1)
SqlDataReader
只是结果的句柄,有点像光标。您需要逐步执行它并选择由结果列名称索引的值。尝试这样的事情:
public User GetUser(string userName)
{
string sql = "SELECT * FROM Users WHERE UserName = @UserName";
User user = null;
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.Parameters.Add("@userName", SqlDbType.VarChar, 12).Value = userName;
connection.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read()) {
// Now you're pointed at the first result row
user = new User {
UserID = dr["UserID"],
Name = dr["Name"],
Whatever = dr["Whatever"]
};
}
}
catch
{
}
}
return user;
}
此外,ADO.NET现在建议使用Parameters.AddWithValue
方法。我觉得它更容易,因为你不必处理类型和长度等等,我从来没有遇到任何结果问题。所以,而不是:
cmd.Parameters.Add("@userName", SqlDbType.VarChar, 12).Value = userName;
您可以使用:
cmd.Parameters.AddWithValue("@userName", userName);