如何在实体框架中使用实体原始SQL查询中的数据



我会提前声明,我对asp.net核心和实体框架仍然很陌生,但我熟悉ADO和记录集,实体框架似乎是从它们构建的。我很难使用实体框架,因为我能够运行查询,但我不确定如何使用结果,我在网上看到的大多数帮助文档只讨论了过程和方法,而没有讨论如何使用结果。我正在我的网站上构建登录功能,并开发了以下代码来查询UserAccount表中的DB。对于这次登录,我真的只想要用户名、密码和ID,但我在这个表中有多个字段,我不需要这些字段。我使用ADO和记录集,所以实际上我更喜欢使用原始sql,并确定我想对这些结果做什么,而不是将它们绑定到一些对象上,这似乎是实体框架在大多数情况下所做的。我确实相信实体框架和使用参数的易用性,所以我更喜欢走这条路(不确定这是否是一种糟糕的做法(。一切都很好,除了当我添加ToList时,它开始说error";InvalidOperationException:"FromSql"操作的结果中不存在所需的列"AccessLevel"我甚至没有尝试在查询中使用该字段,所以不确定为什么会出现这种情况,我使用的是rawsql查询方法,为什么它试图查看我在该表的模型中有什么?最后,这应该返回一条记录,在这种情况下,我想从该记录字段中提取密码值,类似于我在ADO中的做法,正如你在我的密码哈希验证中看到的那样,但我甚至不知道如何从查询结果中提取。谢谢你在这方面的帮助,因为我在学习这些东西时头疼!!

var UserResults = _context.UserAccounts.FromSqlInterpolated($"SELECT USERACCOUNT.USERNAME, USERACCOUNT.PASSWORD, USERACCOUNT.ID,USERACCOUNT.ACCESS_LEVEL FROM DBO.USERACCOUNT WHERE USERACCOUNT.USERNAME={UserName}");
if (UserResults.Count() == 1) //if we have more than 1 result we have security issue so do not allow login
{
var passwordHasher = new PasswordHasher<string>();
var hashedPassword = passwordHasher.HashPassword(null, Password);
var testResults = UserResults.ToList();
if (passwordHasher.VerifyHashedPassword(null, hashedPassword, THIS SHOULD BE VALUE FROM DB RIGHT HERE!!!) == PasswordVerificationResult.Success)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, UserName)
};

我的DBContext如下:

public partial class LoginDBContext : DbContext
{
public DbSet<UserAccount> UserAccounts { get; set; }
public LoginDBContext(DbContextOptions<LoginDBContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserAccount>(entity =>
{
//entity.ToTable("UserAccount");
entity.HasNoKey();
//entity.Property(e => e.Id)
//    .HasMaxLength(50)
//    .IsUnicode(false);
//entity.Property(e => e.Username)
//    .HasMaxLength(50)
//    .IsUnicode(false);
//entity.Property(e => e.Password)
//    .HasMaxLength(50)
//    .IsUnicode(false);
});
}
}

如果您不想加载用户表的所有列,您可以返回具有所需属性的匿名对象,或者为所需列创建一个类并返回。

var users = _context.UserAccounts
.Where(a => a.UserName == UserName)
.Select(a => new { a.Id, a.UserName, a.Password })
.ToArray();
if (users.Length == 1)
{
var user = users.First();
if (passwordHasher.VerifyHashedPassword(null, hashedPassword, user.Password) == PasswordVerificationResult.Success)
{
// ... your magic
}
}

最新更新